本書深入地分析了Redis核心功能的內(nèi)部機(jī)制與實(shí)現(xiàn)方式,大部分內(nèi)容源自對Redis源碼的分析,并從中總結(jié)出實(shí)現(xiàn)原理。通過閱讀本書,讀者可以快速、輕松地了解Redis的內(nèi)部運(yùn)行機(jī)制。 本書首先介紹了Redis常用的數(shù)據(jù)類型的編碼格式,包括字符串、列表、散列、集合、有序集合,這是Redis存儲數(shù)據(jù)的基礎(chǔ)。接著分析了Redis的事件機(jī)制,剖析了Redis事件驅(qū)動(dòng)的實(shí)現(xiàn)原理,通過這部分內(nèi)容,讀者可以了解一個(gè)遠(yuǎn)程服務(wù)程序的整體架構(gòu)。本書還分析了Redis持久化、主從復(fù)制、Sentinel機(jī)制、Cluster機(jī)制的實(shí)現(xiàn)原理,這部分內(nèi)容是Redis的核心功能。在這部分內(nèi)容中,本書也會延伸分析Redis中使用的UNIX機(jī)制,如UNIX網(wǎng)絡(luò)編程、進(jìn)程通信、線程同步等,并通過Redis源碼展示這些UNIX機(jī)制的使用方式。 本書最后介紹了Redis的高級特性,包括事務(wù)、非阻塞刪除、Lua腳本、Module模塊、Stream消息流,以及Redis 6提供的ACL訪問控制列表、Tracking機(jī)制等,這部分內(nèi)容不僅分析內(nèi)部實(shí)現(xiàn),還提供了詳細(xì)的使用案例,幫助讀者循序漸進(jìn)地了解這些特性。
多年軟件設(shè)計(jì)與開發(fā)經(jīng)驗(yàn)。Redis長期使用者,熟悉Redis的核心原理與實(shí)現(xiàn)方式。公眾號(binecy)的維護(hù)者,主要分享各類軟件和框架的源碼分析。
目 錄
第1部分 數(shù)據(jù)結(jié)構(gòu)與編碼
第1章 字符串
1.1 redisObject
1.2 sds
1.2.1 定義
1.2.2 操作分析
1.2.3 編碼
第2章 列表
2.1 ziplist
2.1.1 定義
2.1.2 字節(jié)序
2.1.3 操作分析
2.1.4 級聯(lián)更新
2.2 quicklist
2.2.1 定義
2.2.2 操作分析
2.2.3 編碼
第3章 散列
3.1 字典
3.1.1 定義
3.1.2 操作分析
3.1.3 擴(kuò)容
3.1.4 縮容
3.1.5 編碼
3.2 數(shù)據(jù)庫
第4章 集合
4.1 無序集合
4.1.1 定義
4.1.2 操作分析
4.1.3 編碼
4.2 有序集合
4.2.1 定義
4.2.2 操作分析
4.2.3 編碼
第2部分 事件機(jī)制與命令執(zhí)行
第5章 Redis啟動(dòng)過程
5.1 服務(wù)器定義
5.2 main函數(shù)
5.3 Redis初始化過程
第6章 事件機(jī)制
6.1 Redis事件機(jī)制概述
6.2 Redis啟動(dòng)時(shí)創(chuàng)建的事件
6.3 事件循環(huán)器的運(yùn)行
第7章 epoll與網(wǎng)絡(luò)通信
7.1 I/O復(fù)用模型
7.2 epoll網(wǎng)絡(luò)編程
7.3 Redis網(wǎng)絡(luò)通信啟動(dòng)過程
7.3.1 Redis網(wǎng)絡(luò)服務(wù)
7.3.2 Redis中的epoll
第8章 客戶端
8.1 定義
8.2 創(chuàng)建客戶端
8.3 關(guān)閉客戶端
8.4 客戶端配置
第9章 Redis命令執(zhí)行過程
9.1 RESP協(xié)議
9.2 解析請求
9.3 返回響應(yīng)
9.4 執(zhí)行命令
第10章 網(wǎng)絡(luò)I/O線程
10.1 線程概述
10.2 互斥量概述
10.3 初始化I/O線程
10.4 解析請求
10.5 I/O線程主邏輯
10.6 返回響應(yīng)
10.7 I/O線程狀態(tài)切換
第3部分 持久化與復(fù)制
第11章 RDB
11.1 RDB定時(shí)邏輯
11.2 RDB持久化過程
11.2.1 fork子進(jìn)程
11.2.2 生成RDB文件
11.2.3 寫入RDB數(shù)據(jù)
11.2.4 父進(jìn)程收尾
11.3 RDB文件加載過程
11.4 RDB文件分析示例
11.5 RDB配置
11.6 UNIX寫時(shí)復(fù)制機(jī)制
11.7 UNIX I/O與緩存
11.7.1 內(nèi)核緩沖區(qū)
11.7.2 I/O緩存區(qū)
11.7.3 sync與fdatasync
第12章 AOF
12.1 AOF定時(shí)邏輯
12.2 AOF持久化過程
12.2.1 命令傳播
12.2.2 刷新AOF緩沖區(qū)
12.2.3 同步磁盤
12.3 AOF重寫過程
12.3.1 fork子進(jìn)程
12.3.2 子進(jìn)程處理
12.3.3 父進(jìn)程收尾
12.4 AOF文件加載過程
12.5 AOF文件分析示例
12.6 AOF配置
第13章 主從復(fù)制
13.1 流程概述
13.2 主從握手流程
13.2.1 處理REPLICAOF命令
13.2.2 主從連接
13.2.3 握手流程
13.3 從節(jié)點(diǎn)同步流程
13.3.1 發(fā)送PSYNC命令
13.3.2 部分同步
13.3.3 全量同步
13.4 主節(jié)點(diǎn)同步流程
13.4.1 處理PSYNC命令
13.4.2 全量同步
13.4.3 部分同步
13.4.4 部分同步的實(shí)現(xiàn)細(xì)節(jié)
13.5 PSYNC2
13.5.1 從節(jié)點(diǎn)重啟
13.5.2 Cluster故障轉(zhuǎn)移
13.6 主從復(fù)制流程
13.7 定時(shí)邏輯
13.8 主從復(fù)制配置
第4部分 分布式架構(gòu)
第14章 Raft算法
14.1 分布式一致性的難點(diǎn)
14.2 CAP理論
14.3 Raft算法的設(shè)計(jì)
14.3.1 領(lǐng)導(dǎo)選舉
14.3.2 日志復(fù)制
14.3.3 安全性
14.4 Redis中的Raft算法
第15章 Redis Sentinel
15.1 Redis Sentinel的應(yīng)用示例
15.2 Redis Sentinel的實(shí)現(xiàn)原理
15.2.1 定義
15.2.2 Sentinel節(jié)點(diǎn)啟動(dòng)
15.2.3 Sentinel機(jī)制的主邏輯
15.2.4 Sentinel節(jié)點(diǎn)建立網(wǎng)絡(luò)連接
15.2.5 Sentinel機(jī)制的定時(shí)消息
15.3 Redis Sentinel的故障轉(zhuǎn)移
15.3.1 主觀下線
15.3.2 客觀下線
15.3.3 開始故障轉(zhuǎn)移
15.3.4 選舉leader節(jié)點(diǎn)
15.3.5 故障轉(zhuǎn)移狀態(tài)機(jī)
15.4 客戶端交互
第16章 Redis Cluster
16.1 Redis Cluster的應(yīng)用示例
16.1.1 搭建Redis Cluster集群
16.1.2 客戶端重定向
16.1.3 槽位遷移案例
16.2 Redis Cluster槽位管理
16.2.1 定義
16.2.2 重定向的實(shí)現(xiàn)
16.2.3 槽位遷移的實(shí)現(xiàn)
16.3 Redis Cluster啟動(dòng)過程
16.3.1 節(jié)點(diǎn)啟動(dòng)
16.3.2 節(jié)點(diǎn)握手
16.3.3 指派槽位
16.3.4 建立主從關(guān)系
16.4 Redis Cluster節(jié)點(diǎn)通信
16.4.1 Gossip算法
16.4.2 消息定義
16.4.3 建立連接
16.4.4 握手過程
16.4.5 定時(shí)消息
16.5 Redis Cluster的故障轉(zhuǎn)移
16.5.1 節(jié)點(diǎn)下線
16.5.2 選舉過程
16.5.3 從節(jié)點(diǎn)晉升
16.5.4 更新集群信息
16.5.5 建立主從關(guān)系
第5部分 高級特性
第17章 事務(wù)
17.1 事務(wù)的應(yīng)用示例
17.2 事務(wù)的實(shí)現(xiàn)原理
17.2.1 WATCH命令的實(shí)現(xiàn)
17.2.2 MULTI、EXEC命令的實(shí)現(xiàn)
第18章 非阻塞刪除
18.1 UNLINK命令的實(shí)現(xiàn)原理
18.2 后臺線程
18.2.1 條件變量
18.2.2 后臺線程的實(shí)現(xiàn)
第19章 內(nèi)存管理
19.1 動(dòng)態(tài)內(nèi)存分配器
19.1.1 內(nèi)存分配器概述
19.1.2 Jemalloc設(shè)計(jì)概述
19.1.3 碎片整理機(jī)制
19.2 數(shù)據(jù)過期機(jī)制
19.2.1 定時(shí)刪除
19.2.2 惰性刪除
19.3 數(shù)據(jù)淘汰機(jī)制
19.3.1 LRU時(shí)間戳
19.3.2 LFU計(jì)數(shù)
19.3.3 數(shù)據(jù)淘汰算法
第20章 Redis Stream
20.1 Redis Stream的應(yīng)用示例
20.1.1 添加、讀取消息
20.1.2 消費(fèi)組
20.1.3 ACK確認(rèn)
20.1.4 刪除消息
20.2 Stream的實(shí)現(xiàn)原理
20.2.1 listpack結(jié)構(gòu)
20.2.2 Rax結(jié)構(gòu)
20.2.3 Stream結(jié)構(gòu)
20.2.4 Stream持久化與復(fù)制
第21章 訪問控制列表ACL
21.1 ACL的應(yīng)用示例
21.1.1 創(chuàng)建用戶
21.1.2 可執(zhí)行命令授權(quán)
21.1.3 可訪問鍵授權(quán)
21.1.4 Pub/Sub頻道授權(quán)
21.2 ACL的實(shí)現(xiàn)原理
21.2.1 定義
21.2.2 初始化ACL環(huán)境
21.2.3 用戶規(guī)則設(shè)置
21.2.4 用戶權(quán)限檢查
第22章 Redis Tracking
22.1 Redis Tracking的應(yīng)用示例
22.1.1 基本應(yīng)用
22.1.2 廣播模式
22.1.3 OPTIN、OPTOUT、NOLOOP
22.1.4 轉(zhuǎn)發(fā)模式
22.2 Redis Tracking的實(shí)現(xiàn)原理
22.2.1 RESP3協(xié)議
22.2.2 開啟Redis Tracking
22.2.3 記錄查詢鍵
22.2.4 非廣播模式下發(fā)送失效消息
22.2.5 廣播模式下發(fā)送失效消息
22.2.6 清除記錄鍵
第23章 Lua腳本
23.1 Lua腳本的應(yīng)用示例
23.1.1 使用EVAL命令
23.1.2 redis.call函數(shù)
23.1.3 類型轉(zhuǎn)換
23.1.4 使用Lua實(shí)現(xiàn)數(shù)據(jù)類型
23.1.5 腳本超時(shí)
23.2 Lua腳本的實(shí)現(xiàn)原理
23.2.1 Lua與C語言交互
23.2.2 Redis中的Lua
第24章 Redis Module
24.1 Module的應(yīng)用示例
24.1.1 使用Module實(shí)現(xiàn)數(shù)據(jù)類型
24.1.2 Module API
24.1.3 Module的特性
24.2 Module的實(shí)現(xiàn)原理
24.2.1 C語言動(dòng)態(tài)庫
24.2.2 定義
24.2.3 初始化Module的執(zhí)行環(huán)境
24.2.4 加載Module
24.2.5 創(chuàng)建Module命令
24.2.6 內(nèi)存自動(dòng)管理
24.2.7 調(diào)用Redis命令
24.2.8 自定義數(shù)據(jù)類型