Redis簡介

2018-08-02 14:33 更新

Redis簡介

本書對 Redis 的大多數(shù)單機(jī)功能以及所有多機(jī)功能的實(shí)現(xiàn)原理進(jìn)行了介紹, 展示了這些功能的核心數(shù)據(jù)結(jié)構(gòu)以及關(guān)鍵的算法思想。

通過閱讀本書, 讀者可以快速、有效地了解 Redis 的內(nèi)部構(gòu)造以及運(yùn)作機(jī)制, 這些知識可以幫助讀者更好地、也更高效地使用 Redis 。

為了讓本書的內(nèi)容保持簡單并且容易讀懂, 本書會盡量以高層次的角度來對 Redis 的實(shí)現(xiàn)原理進(jìn)行描述, 如果讀者只是對 Redis 的實(shí)現(xiàn)原理感興趣, 但并不想研究 Redis 的源代碼, 那么閱讀本書就足夠了。

另一方面, 如果讀者打算深入了解 Redis 實(shí)現(xiàn)原理的底層細(xì)節(jié), 本書在 RedisBook.com 提供了一份帶有詳細(xì)注釋的 Redis 源代碼, 讀者可以先閱讀本書對某一功能的介紹, 然后再閱讀該功能對應(yīng)的實(shí)現(xiàn)代碼, 這有助于讀者更快地讀懂實(shí)現(xiàn)代碼, 也有助于讀者更深入地了解該功能的實(shí)現(xiàn)原理。

版本說明

本書是基于 Redis 2.9 —— 也即是 Redis 3.0 的開發(fā)版來編寫的, 因?yàn)?Redis 3.0 的更新主要與 Redis 的多機(jī)功能有關(guān), 而 Redis 3.0 的單機(jī)功能則與 Redis 2.6 、Redis 2.8 的單機(jī)功能基本相同, 所以本書的內(nèi)容對于使用 Redis 2.6 至 Redis 3.0 的讀者來說應(yīng)該都是有用的。

另外, 因?yàn)?Redis 通常都是漸進(jìn)地增加新功能, 并且很少會大幅地修改已有的功能, 所以本書的大部分內(nèi)容對于 Redis 3.0 之后的幾個版本來說, 應(yīng)該也是有用的。

章節(jié)編排

本書由《數(shù)據(jù)結(jié)構(gòu)與對象》、《單機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》、《多機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》、《獨(dú)立功能的實(shí)現(xiàn)》四個部分組成。

第一部分

Redis 數(shù)據(jù)庫里面的每個鍵值對(key-value pair)都是由對象(object)組成的:

  • 其中, 數(shù)據(jù)庫鍵總是一個字符串對象(string object);
  • 而數(shù)據(jù)庫鍵的值則可以是字符串對象、 列表對象(list object)、 哈希對象(hash object)、 集合對象(set object)、 有序集合對象(sorted set object)這五種對象中的其中一種。

比如說, 執(zhí)行以下命令將在數(shù)據(jù)庫中創(chuàng)建一個鍵為字符串對象, 值也為字符串對象的鍵值對:

redis> SET msg "hello world"
OK

而執(zhí)行以下命令將在數(shù)據(jù)庫中創(chuàng)建一個鍵為字符串對象, 值為列表對象的鍵值對:

redis> RPUSH numbers 1 3 5 7 9
(integer) 5

本書的第一部分 —— 也即是《數(shù)據(jù)結(jié)構(gòu)與對象》部分, 將對以上提到的五種不同類型的對象進(jìn)行介紹, 剖析這些對象所使用的底層數(shù)據(jù)結(jié)構(gòu), 并說明這些數(shù)據(jù)結(jié)構(gòu)是如何深刻地影響對象的功能和性能的。

第二部分

本書的第二部分 —— 也即是《單機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》部分, 對 Redis 實(shí)現(xiàn)單機(jī)數(shù)據(jù)庫的方法進(jìn)行了介紹。

《數(shù)據(jù)庫》一章對 Redis 數(shù)據(jù)庫的實(shí)現(xiàn)原理進(jìn)行了介紹: 說明了服務(wù)器保存鍵值對的方法, 服務(wù)器保存鍵值對過期時間的方法, 以及服務(wù)器自動刪除過期鍵值對的方法, 等等。

《RDB 持久化》和《AOF 持久化》兩章分別介紹了 Redis 兩種不同的持久化方式的實(shí)現(xiàn)原理: 說明了服務(wù)器根據(jù)數(shù)據(jù)庫來生成持久化文件的方法, 服務(wù)器根據(jù)持久化文件來還原數(shù)據(jù)庫的方法, 以及 BGSAVE 命令和 BGREWRITEAOF 命令的實(shí)現(xiàn)原理, 等等。

《事件》一章對 Redis 的文件事件和時間事件進(jìn)行了介紹:

  • 文件事件主要用于應(yīng)答(accept)客戶端的連接請求, 接收客戶端發(fā)送的命令請求, 以及向客戶端返回命令回復(fù);
  • 而時間事件則主要用于執(zhí)行 redis.c/serverCron 函數(shù) —— 這個函數(shù)通過執(zhí)行常規(guī)的維護(hù)和管理操作來保持 Redis 服務(wù)器的正常運(yùn)作, 一些重要的定時操作也是由這個函數(shù)負(fù)責(zé)觸發(fā)的。

《客戶端》一章對 Redis 服務(wù)器維護(hù)和管理客戶端狀態(tài)的方法進(jìn)行了介紹: 列舉了客戶端狀態(tài)包含的各個屬性, 說明了客戶端的輸入緩沖區(qū)和輸出緩沖區(qū)的實(shí)現(xiàn)方法, 以及 Redis 服務(wù)器創(chuàng)建和銷毀客戶端狀態(tài)的條件, 等等。

《服務(wù)器》一章對單機(jī) Redis 服務(wù)器的運(yùn)作機(jī)制進(jìn)行了介紹: 詳細(xì)地說明了服務(wù)器處理命令請求的步驟, 解釋了 serverCron 函數(shù)所做的工作, 并講解了 Redis 服務(wù)器的初始化過程。

第三部分

本書的第三部分 —— 也即是《多機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》部分, 對 Redis 的 Sentinel 、復(fù)制(replication)、集群(cluster)三個多機(jī)功能進(jìn)行了介紹。

《Sentinel》一章對 Redis Sentinel 的實(shí)現(xiàn)原理進(jìn)行了介紹: 說明了 Sentinel 監(jiān)視服務(wù)器的方法, Sentinel 判斷服務(wù)器是否下線的方法, 以及 Sentinel 對下線服務(wù)器進(jìn)行故障轉(zhuǎn)移的方法, 等等。

《復(fù)制》一章對 Redis 的主從復(fù)制功能(master-slave replication)的實(shí)現(xiàn)原理進(jìn)行了介紹: 說明了當(dāng)用戶指定一個服務(wù)器(從服務(wù)器)去復(fù)制另一個服務(wù)器(主服務(wù)器)時, 主從服務(wù)器之間執(zhí)行了什么操作, 進(jìn)行了什么數(shù)據(jù)交互, 諸如此類。

《集群》一章對 Redis 集群的實(shí)現(xiàn)原理進(jìn)行了介紹: 說明了節(jié)點(diǎn)(node)的構(gòu)建方法, 節(jié)點(diǎn)處理命令請求的方法, 轉(zhuǎn)發(fā)(redirection)錯誤的實(shí)現(xiàn)方法, 以及各個節(jié)點(diǎn)之間進(jìn)行通訊的方法, 等等。

第四部分

本書的第四部分 —— 也即是《獨(dú)立功能的實(shí)現(xiàn)》部分, 對 Redis 中各個相對獨(dú)立的功能模塊進(jìn)行了介紹。

《發(fā)布與訂閱》一章對 PUBLISH 、 SUBSCRIBE 、 PUBSUB 等命令的實(shí)現(xiàn)原理進(jìn)行了介紹, 解釋了 Redis 的發(fā)布與訂閱功能是如何實(shí)現(xiàn)的。

《事務(wù)》一章對 MULTI 、 EXEC 、 WATCH 等命令的實(shí)現(xiàn)原理進(jìn)行了介紹, 解釋了 Redis 的事務(wù)是如何實(shí)現(xiàn)的, 并說明了 Redis 的事務(wù)對 ACID 性質(zhì)的支持程度。

《Lua 腳本》一章對 EVAL 、 EVALSHA 、 SCRIPT_LOAD 等命令的實(shí)現(xiàn)原理進(jìn)行了介紹, 解釋了 Redis 服務(wù)器是如何執(zhí)行和管理用戶傳入的 Lua 腳本的; 這一章還對 Redis 服務(wù)器構(gòu)建 Lua 環(huán)境的過程, 以及主從服務(wù)器之間復(fù)制 Lua 腳本的方法進(jìn)行了介紹。

《排序》一章對 SORT 命令、 以及 SORT 命令所有可用選項(xiàng)(比如 DESC 、 ALPHA 、 GET ,等等)的實(shí)現(xiàn)原理進(jìn)行了介紹, 并說明了當(dāng)SORT 命令帶有多個選項(xiàng)時, 不同選項(xiàng)執(zhí)行的先后順序。

《二進(jìn)制位數(shù)組》一章對 Redis 保存二進(jìn)制位數(shù)組的方法進(jìn)行了介紹, 并說明了 GETBIT 、 SETBIT 、 BITCOUNT 、 BITOP 這幾個二進(jìn)制位數(shù)組操作命令的實(shí)現(xiàn)原理。

《慢查詢?nèi)罩尽芬徽聦?Redis 創(chuàng)建和保存慢查詢?nèi)罩荆╯low log)的方法進(jìn)行了介紹, 并說明了 SLOWLOG GET 、 SLOWLOG LEN 、SLOWLOG RESET 等慢查詢?nèi)罩静僮髅畹膶?shí)現(xiàn)原理。

《監(jiān)視器》一章介紹了將客戶端變?yōu)楸O(jiān)視器(monitor)的方法, 以及服務(wù)器在處理命令請求時, 向監(jiān)視器發(fā)送命令信息的方法。

推薦的閱讀方法

因?yàn)?Redis 的單機(jī)功能是多機(jī)功能的子集, 所以無論讀者使用的是單機(jī)模式的 Redis , 還是多機(jī)模式的 Redis , 都應(yīng)該閱讀本書的第一部分和第二部分, 也即是《數(shù)據(jù)結(jié)構(gòu)與對象》部分和《單機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》部分, 這兩個部分包含的知識是所有 Redis 使用者都必然會用到的。

如果讀者要使用 Redis 的多機(jī)功能, 那么在閱讀本書的第一部分和第二部分之后, 應(yīng)該接著閱讀本書的第三部分, 也即是《多機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)》部分; 相反地, 如果讀者只使用 Redis 的單機(jī)功能, 那么可以跳過第三部分, 直接閱讀第四部分。

本書的前三個部分都是以自底向上(bottom-up)的方式來寫的, 也就是說, 排在后面的章節(jié)會假設(shè)讀者已經(jīng)讀過了排在前面的章節(jié): 如果一個概念在前面的章節(jié)已經(jīng)介紹過, 那么后面的章節(jié)就不會再重復(fù)介紹這個概念, 所以讀者最好按順序閱讀這三部分的各個章節(jié)。

本書的第四部分 —— 也即是《獨(dú)立功能的實(shí)現(xiàn)》部分包含的各章是完全獨(dú)立的, 讀者可以按自己的興趣來挑選要讀的章節(jié)。

在本書的第四部分中, 除了《Lua 腳本》一章的其中一節(jié)有涉及多機(jī)功能的內(nèi)容之外, 其他章節(jié)都沒有涉及多機(jī)功能的內(nèi)容, 所以第四部分的大部分內(nèi)容都可以在只閱讀了本書第一部分和第二部分的情況下閱讀。

圖 1-1 對上面描述的閱讀方法進(jìn)行了總結(jié)。

document/2015-09-13/55f4eb1dbb973

行文規(guī)則

名字引用規(guī)則

在第一次引用 Redis 源代碼文件 file 中的名字 name 時, 本書使用 file/name 格式: 比如 redis.c/main 表示 redis.c 文件中的 main函數(shù), 而 redis.h/redisDb 則表示 redis.h 文件中的 redisDb 結(jié)構(gòu), 諸如此類。

另外, 在第一次引用標(biāo)準(zhǔn)庫頭文件 file 中的名字 name 時, 本書使用 <file>/name 格式: 比如 <unistd.h>/write 表示 unistd.h 頭文件的 write 函數(shù), 而 <stdio.h>/printf 則表示 stdio.h 頭文件的 printf 函數(shù), 諸如此類。

在第一次引用某個名字之后, 本書就會去掉名字前綴的文件名, 直接使用名字本身。

舉個例子, 當(dāng)本書第一次引用 redis.h 文件的 redisDb 結(jié)構(gòu)的時候, 本書會使用 redis.h/redisDb 格式, 而之后再次引用 redisDb 結(jié)構(gòu)時, 本書只使用名字 redisDb 。

結(jié)構(gòu)引用規(guī)則

本書使用 struct.property 格式來引用 struct 結(jié)構(gòu)的 property 屬性: 比如 redisDb.id 表示 redisDb 結(jié)構(gòu)的 id 屬性, 而redisDb.expires 則表示 redisDb 結(jié)構(gòu)的 expires 屬性, 諸如此類。

算法規(guī)則

除非有額外說明, 否則本書列出的算法復(fù)雜度一律為最壞情形下的算法復(fù)雜度。

代碼規(guī)則

本書使用 C 語言和 Python 語言來展示代碼:

  • 在描述數(shù)據(jù)結(jié)構(gòu)以及比較簡短的代碼時, 本書通常會直接粘貼 Redis 的源代碼, 也即是 C 語言代碼。
  • 相反地, 當(dāng)需要使用代碼來描述比較長或者比較復(fù)雜的程序時, 本書通常會使用 Python 語言來表示偽代碼。

本書展示的 Python 偽代碼中通常會包含 server 和 client 兩個全局變量: 其中 server 表示服務(wù)器狀態(tài)(redis.h/redisServer 結(jié)構(gòu)的實(shí)例), 而 client 則表示正在執(zhí)行操作的客戶端狀態(tài)(redis.h/redisClient 結(jié)構(gòu)的實(shí)例)。

配套網(wǎng)站

本書帶有配套網(wǎng)站 RedisBook.com , 這個網(wǎng)站記錄了本書的最新消息, 并且提供了附帶詳細(xì)注釋的 Redis 源代碼可供下載, 讀者也可以通過這個網(wǎng)站查看和反饋本書的勘誤, 或者發(fā)表與本書有關(guān)的問題、意見、以及建議。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號