Redis 設計與實現

2021-06-18 01:23:06 字數 1679 閱讀 8763

本書的目標是以簡明易懂的方式講解 redis 的內部執行機制, 通過閱讀本書, 你可以了解到 redis 從資料結構到伺服器構造在內的幾乎所有知識。

為了保證內容的簡潔性, 本書會盡量以高抽象層次的角度來觀察 redis , 並將**的細節留給讀者自己去考究。

如果讀者只是對 redis 的內部運作機制感興趣, 但並不想深入**, 那麼只閱讀本書就足夠了。

另一方面, 對於需要深入研究 redis **的讀者, 本書附帶了乙份 帶有詳細注釋的 redis 2.6 源** , 可以配合本書一併使用。

redis 和其他很多 key-value 資料庫的不同之處在於, redis 不僅支援簡單的字串鍵值對, 它還提供了一系列資料結構型別值, 比如列表、雜湊、集合和有序集, 並在這些資料結構型別上定義了一套強大的 api 。

通過對不同型別的值進行操作, redis 可以很輕易地完成其他只支援字串鍵值對的 key-value 資料庫很難(或者無法)完成的任務。

在 redis 的內部, 資料結構型別值由高效的資料結構和演算法進行支援, 並且在 redis 自身的構建當中, 也大量用到了這些資料結構。

這一部分將對 redis 記憶體所使用的資料結構和演算法進行介紹。

雙端鍊錶

字典跳躍表

雖然內部資料結構非常強大, 但是建立一系列完整的資料結構本身也是一件相當耗費記憶體的工作, 當乙個物件包含的元素數量並不多, 或者元素本身的體積並不大時, 使用代價高昂的內部資料結構並不是最好的辦法。

為了解決這一問題, redis 在條件允許的情況下, 會使用記憶體對映資料結構來代替內部資料結構。

記憶體對映資料結構是一系列經過特殊編碼的位元組序列, 建立它們所消耗的記憶體通常比作用類似的內部資料結構要少得多, 如果使用得當, 記憶體對映資料結構可以為使用者節省大量的記憶體。

不過, 因為記憶體對映資料結構的編碼和操作方式要比內部資料結構要複雜得多, 所以記憶體對映資料結構所占用的 cpu 時間會比作用類似的內部資料結構要多。

這一部分將對 redis 目前正在使用的兩種記憶體對映資料結構進行介紹。

壓縮列表

既然 redis 的鍵值對可以儲存不同型別的值, 那麼很自然就需要對鍵值的型別進行檢查以及多型處理。

為了讓基於型別的操作更加方便地執行, redis 建立了自己的型別系統。

在這一部分, 我們將對 redis 所使用的物件系統進行了解, 並分別觀察字串、雜湊表、列表、集合和有序集型別的底層實現。

字串雜湊表

列表集合

有序集

除了針對單個鍵值對的操作外, redis 還提供了一些同時對多個鍵值對進行處理的功能, 比如事務和 lua 指令碼。

另外, 一些輔助性的功能, 比如慢查詢, 以及一些和資料庫無關的功能, 比如訂閱與發布, 我們也會經常用到。

通過理解這些功能的底層實現, 我們可以更有效地使用它們。

這一部分將對這些功能進行介紹。

訂閱與發布

lua 指令碼

慢查詢日誌

以下章節將對 redis 最底層也最隱蔽的模組進行**:

以上的這些問題,都是這一部分要解答的。

rdbaof

事件伺服器與客戶端

本書由 huangz 編寫。

我在研究 redis 原始碼並創作本書的過程中獲得了極大的快樂,希望你在閱讀本書時也能有同感。

要了解編寫本書時用到的工具(原始碼管理、文件的生成和託管、生成,等等),請閱讀 這篇文章 。

redis設計與實現

物件所使用的底層資料結構 編碼常量 object encoding 命令輸出 整數redis encoding int int embstr編碼的簡單動態字串 sds redis encoding embstr embstr 簡單動態字串 redis encoding raw raw 字典redis...

《redis設計與實現》

提高系統架構的效能,增加快取層是常見的優化方式,redis和memcache是當前採用較多的快取元件,redis被稱為資料結構資料庫 redis和memcache的區別 redis和memcahce都是基於記憶體的key value儲存 memcache的事件模型是多執行緒reactor模型,效能更...

Redis設計與實現(一)

redis是一種現在挺火的一種nosql資料庫,它一般被用作快取。比如我們可以在redis客戶端敲 redis set msg helloredis 那麼就會在redis資料庫中建立乙個新的鍵值對,keg是msg,value是helloredis,兩個都是sds。又比如在redis客戶端敲 redi...