Redis設(shè)計(jì)與實(shí)現(xiàn)

2021-04-20 21:28 更新

Redis設(shè)計(jì)與實(shí)現(xiàn)

黃健宏 著


  • 出版社: 機(jī)械工業(yè)出版社
  • ISBN:9787111464747
  • 版次:1
  • 商品編碼:11486101
  • 品牌:機(jī)工出版
  • 包裝:平裝
  • 叢書名: 數(shù)據(jù)庫技術(shù)叢書
  • 開本:16開
  • 出版時(shí)間:2014-06-01
  • 用紙:膠版紙
  • 頁數(shù):404


點(diǎn)此購買


編輯推薦

  系統(tǒng)而全面地描述了 Redis 內(nèi)部運(yùn)行機(jī)制;
  圖示豐富,描述清晰,并給出大量參考信息,是NoSQL數(shù)據(jù)庫開發(fā)人員案頭必備;
  包括大部分Redis單機(jī)特征,以及所有多機(jī)特性。


內(nèi)容簡介

  《Redis設(shè)計(jì)與實(shí)現(xiàn)》對(duì)Redis的大多數(shù)單機(jī)功能以及所有多機(jī)功能的實(shí)現(xiàn)原理進(jìn)行了介紹,展示了這些功能的核心數(shù)據(jù)結(jié)構(gòu)以及關(guān)鍵的算法思想。通過閱讀本書,讀者可以快速、有效地了解Redis的內(nèi)部構(gòu)造以及運(yùn)作機(jī)制,這些知識(shí)可以幫助讀者更好、更高效地使用Redis。本書主要分為四大部分。第一部分“數(shù)據(jù)結(jié)構(gòu)與對(duì)象”介紹了Redis中的各種對(duì)象及其數(shù)據(jù)結(jié)構(gòu),并說明這些數(shù)據(jù)結(jié)構(gòu)如何影響對(duì)象的功能和性能。第二部分“單機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)”對(duì)Redis實(shí)現(xiàn)單機(jī)數(shù)據(jù)庫的方法進(jìn)行了介紹,包括數(shù)據(jù)庫、RDB持久化、AOF持久化、事件等。第三部分“多機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)”對(duì)Redis的Sentinel、復(fù)制(replication)、集群(cluster)三個(gè)多機(jī)功能進(jìn)行了介紹。第四部分“獨(dú)立功能的實(shí)現(xiàn)”對(duì)Redis中各個(gè)相對(duì)獨(dú)立的功能模塊進(jìn)行了介紹,涉及發(fā)布與訂閱、事務(wù)、Lua腳本、排序、二進(jìn)制位數(shù)組、慢查詢?nèi)罩?、監(jiān)視器等。


作者簡介

  黃健宏,軟件開發(fā)者,他喜歡函數(shù)式編程,熱愛開源軟件。出于對(duì)數(shù)據(jù)庫的強(qiáng)烈興趣,他開始閱讀和分析 Redis 源代碼,并對(duì) Redis 2.6 和 Redis 3.0 的源代碼進(jìn)行了詳細(xì)注釋。他翻譯并維護(hù)著 Redis 中文文檔網(wǎng)站 www.RedisDoc.com ,編寫了 OORedis 庫。除此之外,他還是《Redis in Action》一書的譯者。


精彩書評(píng)

  這本書描述的知識(shí)點(diǎn)很豐富,覆蓋很全,里面提到特性較多,有不少我們也沒用過:) 每個(gè)命令內(nèi)部的機(jī)制的介紹很不錯(cuò),很多估計(jì)也是首次有詳細(xì)文檔介紹。
  ——楊衛(wèi)華(@TimYang)新浪微博技術(shù)總監(jiān)
  
  
  Redis 是近些年來特別火爆的 NoSQL 之一。縱觀中外各種書籍還沒有一本能對(duì) Redis 內(nèi)部進(jìn)行深入剖析,《Redis 設(shè)計(jì)與實(shí)現(xiàn)》可謂開此先河。常和作者在網(wǎng)上交流,知道作者為這本書付出了大量的心血。這本書行文流暢,思路清晰,詳細(xì)地介紹了 Redis 源碼的方方面面。無論是想學(xué)習(xí) NoSQL、網(wǎng)絡(luò)編程的初學(xué)者,還是源碼控的進(jìn)階者,本書都會(huì)有很大的幫助。
  —— 阮若夷,支付寶高級(jí)專家


目錄

前言
致謝
第1章 引言 1
1.1 Redis版本說明 1
1.2 章節(jié)編排 1
1.3 推薦的閱讀方法 4
1.4 行文規(guī)則 4
1.5 配套網(wǎng)站 5


第一部分·數(shù)據(jù)結(jié)構(gòu)與對(duì)象
第2章 簡單動(dòng)態(tài)字符串 8
2.1 SDS的定義 9
2.2 SDS與C字符串的區(qū)別 10
2.3 SDS API 17
2.4 重點(diǎn)回顧 18
2.5 參考資料 18
第3章 鏈表 19
3.1 鏈表和鏈表節(jié)點(diǎn)的實(shí)現(xiàn) 20
3.2 鏈表和鏈表節(jié)點(diǎn)的API 21
3.3 重點(diǎn)回顧 22
第4章 字典 23
4.1 字典的實(shí)現(xiàn) 24
4.2 哈希算法 27
4.3 解決鍵沖突 28
4.4 rehash 29
4.5 漸進(jìn)式rehash 32
4.6 字典API 36
4.7 重點(diǎn)回顧 37
第5章 跳躍表 38
5.1 跳躍表的實(shí)現(xiàn) 39
5.2 跳躍表API 44
5.3 重點(diǎn)回顧 45
第6章 整數(shù)集合 46
6.1 整數(shù)集合的實(shí)現(xiàn) 46
6.2 升級(jí) 48
6.3 升級(jí)的好處 50
6.4 降級(jí) 51
6.5 整數(shù)集合API 51
6.6 重點(diǎn)回顧 51
第7章 壓縮列表 52
7.1 壓縮列表的構(gòu)成 52
7.2 壓縮列表節(jié)點(diǎn)的構(gòu)成 54
7.3 連鎖更新 57
7.4 壓縮列表API 59
7.5 重點(diǎn)回顧 59
第8章 對(duì)象 60
8.1 對(duì)象的類型與編碼 60
8.2 字符串對(duì)象 64
8.3 列表對(duì)象 68
8.4 哈希對(duì)象 71
8.5 集合對(duì)象 75
8.6 有序集合對(duì)象 77
8.7 類型檢查與命令多態(tài) 81
8.8 內(nèi)存回收 84
8.9 對(duì)象共享 85
8.10 對(duì)象的空轉(zhuǎn)時(shí)長 87
8.11 重點(diǎn)回顧 88


第二部分·單機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)
第9章 數(shù)據(jù)庫 90
9.1 服務(wù)器中的數(shù)據(jù)庫 90
9.2 切換數(shù)據(jù)庫 91
9.3 數(shù)據(jù)庫鍵空間 93
9.4 設(shè)置鍵的生存時(shí)間或過期時(shí)間 99
9.5 過期鍵刪除策略 107
9.6 Redis的過期鍵刪除策略 108
9.7 AOF、RDB和復(fù)制功能對(duì)過期鍵的處理 111
9.8 數(shù)據(jù)庫通知 113
9.9 重點(diǎn)回顧 117
第10章 RDB持久化 118
10.1 RDB 文件的創(chuàng)建與載入 119
10.2 自動(dòng)間隔性保存 121
10.3 RDB 文件結(jié)構(gòu) 125
10.4 分析RDB文件 133
10.5 重點(diǎn)回顧 137
10.6 參考資料 137
第11章 AOF持久化 138
11.1 AOF持久化的實(shí)現(xiàn) 139
11.2 AOF文件的載入與數(shù)據(jù)還原 142
11.3 AOF重寫 143
11.4 重點(diǎn)回顧 150
第12章 事件 151
12.1 文件事件 151
12.2 時(shí)間事件 156
12.3 事件的調(diào)度與執(zhí)行 159
12.4 重點(diǎn)回顧 161
12.5 參考資料 161
第13章 客戶端 162
13.1 客戶端屬性 163
13.2 客戶端的創(chuàng)建與關(guān)閉 172
13.3 重點(diǎn)回顧 174
第14章 服務(wù)器 176
14.1 命令請(qǐng)求的執(zhí)行過程 176
14.2 serverCron函數(shù) 184
14.3 初始化服務(wù)器 192
14.4 重點(diǎn)回顧 196


第三部分·多機(jī)數(shù)據(jù)庫的實(shí)現(xiàn)
第15章 復(fù)制 198
15.1 舊版復(fù)制功能的實(shí)現(xiàn) 199
15.2 舊版復(fù)制功能的缺陷 201
15.3 新版復(fù)制功能的實(shí)現(xiàn) 203
15.4 部分重同步的實(shí)現(xiàn) 204
15.5 PSYNC 命令的實(shí)現(xiàn) 209
15.6 復(fù)制的實(shí)現(xiàn) 211
15.7 心跳檢測 216
15.8 重點(diǎn)回顧 218
第16章 Sentinel 219
16.1 啟動(dòng)并初始化Sentinel 220
16.2 獲取主服務(wù)器信息 227
16.3 獲取從服務(wù)器信息 229
16.4 向主服務(wù)器和從服務(wù)器發(fā)送信息 230
16.5 接收來自主服務(wù)器和從服務(wù)器的頻道信息 231
16.6 檢測主觀下線狀態(tài) 234
16.7 檢查客觀下線狀態(tài) 236
16.8 選舉領(lǐng)頭Sentinel 238
16.9 故障轉(zhuǎn)移 240
16.10 重點(diǎn)回顧 243
16.11 參考資料 244
第17章 集群 245
17.1 節(jié)點(diǎn) 245
17.2 槽指派 251
17.3 在集群中執(zhí)行命令 258
17.4 重新分片 265
17.5 ASK錯(cuò)誤 267
17.6 復(fù)制與故障轉(zhuǎn)移 273
17.7 消息 281
17.8 重點(diǎn)回顧 288


第四部分·獨(dú)立功能的實(shí)現(xiàn)
第18章 發(fā)布與訂閱 290
18.1 頻道的訂閱與退訂 292
18.2 模式的訂閱與退訂 295
18.3 發(fā)送消息 298
18.4 查看訂閱信息 300
18.5 重點(diǎn)回顧 303
18.6 參考資料 304
第19章 事務(wù) 305
19.1 事務(wù)的實(shí)現(xiàn) 306
19.2 WATCH 命令的實(shí)現(xiàn) 310
19.3 事務(wù)的ACID 性質(zhì) 314
19.4 重點(diǎn)回顧 319
19.5 參考資料 320
第20章 Lua腳本 321
20.1 創(chuàng)建并修改Lua 環(huán)境 322
20.2 Lua 環(huán)境協(xié)作組件 327
20.3 EVAL命令的實(shí)現(xiàn) 329
20.4 EVALSHA 命令的實(shí)現(xiàn) 332
20.5 腳本管理命令的實(shí)現(xiàn) 333
20.6 腳本復(fù)制 336
20.7 重點(diǎn)回顧 342
20.8 參考資料 343
第21章 排序 344
21.1 SORT 命令的實(shí)現(xiàn) 345
21.2 ALPHA 選項(xiàng)的實(shí)現(xiàn) 347
21.3 ASC 選項(xiàng)和DESC 選項(xiàng)的實(shí)現(xiàn) 348
21.4 BY選項(xiàng)的實(shí)現(xiàn) 350
21.5 帶有ALPHA 選項(xiàng)的BY 選項(xiàng)的實(shí)現(xiàn) 352
21.6 LIMIT 選項(xiàng)的實(shí)現(xiàn) 353
21.7 GET選項(xiàng)的實(shí)現(xiàn) 355
21.8 STORE 選項(xiàng)的實(shí)現(xiàn) 358
21.9 多個(gè)選項(xiàng)的執(zhí)行順序 359
21.10 重點(diǎn)回顧 361
第22章 二進(jìn)制位數(shù)組 362
22.1 位數(shù)組的表示 363
22.2 GETBIT命令的實(shí)現(xiàn) 365
22.3 SETBIT 命令的實(shí)現(xiàn) 366
22.4 BITCOUNT 命令的實(shí)現(xiàn) 369
22.5 BITOP 命令的實(shí)現(xiàn) 376
22.6 重點(diǎn)回顧 377
22.7 參考資料 377
第23章 慢查詢?nèi)罩?378
23.1 慢查詢記錄的保存 380
23.2 慢查詢?nèi)罩镜拈営[和刪除 382
23.3 添加新日志 383
23.4 重點(diǎn)回顧 385
第24章 監(jiān)視器 386
24.1 成為監(jiān)視器 387
24.2 向監(jiān)視器發(fā)送命令信息 387
24.3 重點(diǎn)回顧 388


前言/序言

  時(shí)間回到2011年4月,當(dāng)時(shí)我正在編寫一個(gè)用戶關(guān)系模塊,這個(gè)模塊需要實(shí)現(xiàn)一個(gè)“共同關(guān)注”功能,用于計(jì)算出兩個(gè)用戶關(guān)注了哪些相同的用戶。
  舉個(gè)例子,假設(shè)huangz關(guān)注了peter、tom、jack三個(gè)用戶,而john關(guān)注了peter、tom、bob、david四個(gè)用戶,那么當(dāng)huangz訪問john的頁面時(shí),共同關(guān)注功能就會(huì)計(jì)算并打印出類似“你跟john都關(guān)注了peter和tom”這樣的信息。
  從集合計(jì)算的角度來看,共同關(guān)注功能本質(zhì)上就是計(jì)算兩個(gè)用戶關(guān)注集合的交集,因?yàn)榻患@個(gè)概念是如此的常見,所以我很自然地認(rèn)為共同關(guān)注這個(gè)功能可以很容易地實(shí)現(xiàn),但現(xiàn)實(shí)卻給了我當(dāng)頭一棒:我所使用的關(guān)系數(shù)據(jù)庫并不直接支持交集計(jì)算操作,要計(jì)算兩個(gè)集合的交集,除了需要對(duì)兩個(gè)數(shù)據(jù)表執(zhí)行合并(join)操作之外,還需要對(duì)合并的結(jié)果執(zhí)行去重復(fù)(distinct)操作,最終導(dǎo)致交集操作的實(shí)現(xiàn)變得異常復(fù)雜。
  是否存在直接支持集合操作的數(shù)據(jù)庫呢?帶著這個(gè)疑問,我在搜索引擎上面進(jìn)行查找,并最終發(fā)現(xiàn)了Redis。在我看來,Redis正是我想要找的那種數(shù)據(jù)庫——它內(nèi)置了集合數(shù)據(jù)類型,并支持對(duì)集合執(zhí)行交集、并集、差集等集合計(jì)算操作,其中的交集計(jì)算操作可以直接用于實(shí)現(xiàn)我想要的共同關(guān)注功能。
  得益于Redis本身的簡單性,以及Redis手冊(cè)的詳盡和完善,我很快學(xué)會(huì)了怎樣使用Redis的集合數(shù)據(jù)類型,并用它重新實(shí)現(xiàn)了整個(gè)用戶關(guān)系模塊:重寫之后的關(guān)系模塊不僅代碼量更少,速度更快,更重要的是,之前需要使用一段甚至一大段SQL查詢才能實(shí)現(xiàn)的功能,現(xiàn)在只需要調(diào)用一兩個(gè)Redis命令就能夠?qū)崿F(xiàn)了,整個(gè)模塊的可讀性得到了極大的提高。
  自此之后,我開始在越來越多的項(xiàng)目里面使用Redis,與此同時(shí),我對(duì)Redis的內(nèi)部實(shí)現(xiàn)也越來越感興趣,一些問題開始頻繁地出現(xiàn)在我的腦海中,比如:
  ??Redis的五種數(shù)據(jù)類型分別是由什么數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的?
  ??Redis的字符串?dāng)?shù)據(jù)類型既可以存儲(chǔ)字符串(比如"hello world"),又可以存儲(chǔ)整數(shù)和浮點(diǎn)數(shù)(比如10086和3.14),甚至是二進(jìn)制位(使用SETBIT等命令),Redis在內(nèi)部是怎樣存儲(chǔ)這些值的?
  ??Redis的一部分命令只能對(duì)特定數(shù)據(jù)類型執(zhí)行(比如APPEND只能對(duì)字符串執(zhí)行,HSET只能對(duì)哈希表執(zhí)行),而另一部分命令卻可以對(duì)所有數(shù)據(jù)類型執(zhí)行(比如DEL、TYPE和EXPIRE),不同的命令在執(zhí)行時(shí)是如何進(jìn)行類型檢查的?Redis在內(nèi)部是否實(shí)現(xiàn)了一個(gè)類型系統(tǒng)?
  ??Redis的數(shù)據(jù)庫是怎樣存儲(chǔ)各種不同數(shù)據(jù)類型的鍵值對(duì)的?數(shù)據(jù)庫里面的過期鍵又是怎樣實(shí)現(xiàn)自動(dòng)刪除的?
  ??除了數(shù)據(jù)庫之外,Redis還擁有發(fā)布與訂閱、腳本、事務(wù)等特性,這些特性又是如何實(shí)現(xiàn)的?
  ??Redis使用什么模型或者模式來處理客戶端的命令請(qǐng)求?一條命令請(qǐng)求從發(fā)送到返回需要經(jīng)過什么步驟?
  為了找到這些問題的答案,我再次在搜索引擎上面進(jìn)行查找,可惜的是這次搜索并沒有多少收獲:Redis還是一個(gè)非常年輕的軟件,對(duì)它的最好介紹就是官方網(wǎng)站上面的文檔,但是這些文檔主要關(guān)注的是怎樣使用Redis,而不是介紹Redis的內(nèi)部實(shí)現(xiàn)。另外,網(wǎng)上雖然有一些博客文章對(duì)Redis的內(nèi)部實(shí)現(xiàn)進(jìn)行了介紹,但這些文章要么不齊全(只介紹了Redis中的少數(shù)幾個(gè)特性),要么就寫得過于簡單(只是一些概述性的文章),要么關(guān)注的就是舊版本(比如2.0、2.2或者2.4,而當(dāng)時(shí)的最新版已經(jīng)是2.6了)。
  綜合來看,詳細(xì)而且完整地介紹Redis內(nèi)部實(shí)現(xiàn)的資料,無論是外文還是中文都不存在。意識(shí)到這一點(diǎn)之后,我決定自己動(dòng)手注釋Redis的源代碼,從中尋找問題的答案,并通過寫博客的方式與其他Redis用戶分享我的發(fā)現(xiàn)。在積累了七八篇Redis源代碼注釋文章之后,我想如果能將這些博文匯集成書的話,那一定會(huì)非常有趣,并且我自己也會(huì)從中學(xué)到很多知識(shí)。于是我在2012年年末開始創(chuàng)作《Redis設(shè)計(jì)與實(shí)現(xiàn)》,并最終于2013年3月8日在互聯(lián)網(wǎng)發(fā)布了本書的第一版。
  盡管《Redis設(shè)計(jì)與實(shí)現(xiàn)》第一版順利發(fā)布了,但在我的心目中,這個(gè)第一版還是有很多不完善的地方:
  ??比如說,因?yàn)榈谝话媸俏疫呑⑨孯edis源代碼邊寫的,如果有足夠時(shí)間讓我先完整地注釋一遍Redis的源代碼,然后再進(jìn)行寫作的話,那么書本在內(nèi)容方面應(yīng)該會(huì)更為全面。
  ??又比如說,第一版只介紹了Redis的內(nèi)部機(jī)制和單機(jī)特性,但并沒有介紹Redis多機(jī)特性,而我認(rèn)為只有將關(guān)于多機(jī)特性的介紹也包含進(jìn)來,這本《Redis設(shè)計(jì)與實(shí)現(xiàn)》才算是真正的完成了。
  就在我考慮應(yīng)該何時(shí)編寫新版來修復(fù)這些缺陷的時(shí)候,機(jī)械工業(yè)出版社的吳怡編輯來信詢問我是否有興趣正式地出版《Redis設(shè)計(jì)與實(shí)現(xiàn)》,能夠正式地出版自己寫的書一直是我夢(mèng)寐以求的事情,我找不到任何拒絕這一邀請(qǐng)的理由,就這樣,在《Redis設(shè)計(jì)與實(shí)現(xiàn)》第一版發(fā)布幾天之后,新版《Redis設(shè)計(jì)與實(shí)現(xiàn)》的寫作也馬不停蹄地開始了。
  從2013年3月到2014年1月這11個(gè)月間,我重新注釋了Redis在unstable分支的源代碼(也即是現(xiàn)在的Redis 3.0源代碼),重寫了《Redis設(shè)計(jì)與實(shí)現(xiàn)》第一版已有的所有章節(jié),并向書中添加了關(guān)于二進(jìn)制位操作(bitop)、排序、復(fù)制、Sentinel和集群等主題的新章節(jié),最終完成了這本新版的《Redis 設(shè)計(jì)與實(shí)現(xiàn)》。本書不僅介紹了Redis的內(nèi)部機(jī)制(比如數(shù)據(jù)庫實(shí)現(xiàn)、類型系統(tǒng)、事件模型),而且還介紹了大部分Redis單機(jī)特性(比如事務(wù)、持久化、Lua腳本、排序、二進(jìn)制位操作),以及所有Redis多機(jī)特性(如復(fù)制、Sentinel和集群)。
  雖然作者創(chuàng)作本書的初衷只是為了滿足自己的好奇心,但了解Redis內(nèi)部實(shí)現(xiàn)的好處并不僅僅在于滿足好奇心:通過了解Redis的內(nèi)部實(shí)現(xiàn),理解每一個(gè)特性和命令背后的運(yùn)作機(jī)制,可以幫助我們更高效地使用Redis,避開那些可能會(huì)引起性能問題的陷阱。我衷心希望這本新版《Redis設(shè)計(jì)與實(shí)現(xiàn)》能夠幫助讀者更好地了解Redis,并成為更優(yōu)秀的Redis使用者。
  本書的第一版獲得了很多熱心讀者的反饋,這本新版的很多改進(jìn)也來源于讀者們的意見和建議,因此我將繼續(xù)在www.RedisBook.com設(shè)置disqus論壇(可以不注冊(cè)直接發(fā)貼),歡迎讀者隨時(shí)就這本新版《Redis設(shè)計(jì)與實(shí)現(xiàn)》發(fā)表提問、意見、建議、批評(píng)、勘誤,等等,我會(huì)努力地采納大家的意見,爭取在將來寫出更好的《Redis設(shè)計(jì)與實(shí)現(xiàn)》,以此來回報(bào)大家對(duì)本書的支持。
  黃健宏(huangz)
  2014年3月于清遠(yuǎn)


點(diǎn)此購買


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)