本書深入地分析了Redis核心功能的內(nèi)部機制與實現(xiàn)方式,大部分內(nèi)容源自對Redis源碼的分析,并從中總結(jié)出實現(xiàn)原理。通過閱讀本書,讀者可以快速、輕松地了解Redis的內(nèi)部運行機制。 本書首先介紹了Redis常用的數(shù)據(jù)類型的編碼格式,包括字符串、列表、散列、集合、有序集合,這是Redis存儲數(shù)據(jù)的基礎(chǔ)。接著分析了Redis的事件機制,剖析了Redis事件驅(qū)動的實現(xiàn)原理,通過這部分內(nèi)容,讀者可以了解一個遠程服務(wù)程序的整體架構(gòu)。本書還分析了Redis持久化、主從復(fù)制、Sentinel機制、Cluster機制的實現(xiàn)原理,這部分內(nèi)容是Redis的核心功能。在這部分內(nèi)容中,本書也會延伸分析Redis中使用的UNIX機制,如UNIX網(wǎng)絡(luò)編程、進程通信、線程同步等,并通過Redis源碼展示這些UNIX機制的使用方式。 本書最后介紹了Redis的高級特性,包括事務(wù)、非阻塞刪除、Lua腳本、Module模塊、Stream消息流,以及Redis 6提供的ACL訪問控制列表、Tracking機制等,這部分內(nèi)容不僅分析內(nèi)部實現(xiàn),還提供了詳細的使用案例,幫助讀者循序漸進地了解這些特性。
多年軟件設(shè)計與開發(fā)經(jīng)驗。Redis長期使用者,熟悉Redis的核心原理與實現(xiàn)方式。公眾號(binecy)的維護者,主要分享各類軟件和框架的源碼分析。
目 錄
第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 擴容
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部分 事件機制與命令執(zhí)行
第5章 Redis啟動過程
5.1 服務(wù)器定義
5.2 main函數(shù)
5.3 Redis初始化過程
第6章 事件機制
6.1 Redis事件機制概述
6.2 Redis啟動時創(chuàng)建的事件
6.3 事件循環(huán)器的運行
第7章 epoll與網(wǎng)絡(luò)通信
7.1 I/O復(fù)用模型
7.2 epoll網(wǎng)絡(luò)編程
7.3 Redis網(wǎng)絡(luò)通信啟動過程
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定時邏輯
11.2 RDB持久化過程
11.2.1 fork子進程
11.2.2 生成RDB文件
11.2.3 寫入RDB數(shù)據(jù)
11.2.4 父進程收尾
11.3 RDB文件加載過程
11.4 RDB文件分析示例
11.5 RDB配置
11.6 UNIX寫時復(fù)制機制
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定時邏輯
12.2 AOF持久化過程
12.2.1 命令傳播
12.2.2 刷新AOF緩沖區(qū)
12.2.3 同步磁盤
12.3 AOF重寫過程
12.3.1 fork子進程
12.3.2 子進程處理
12.3.3 父進程收尾
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é)點同步流程
13.3.1 發(fā)送PSYNC命令
13.3.2 部分同步
13.3.3 全量同步
13.4 主節(jié)點同步流程
13.4.1 處理PSYNC命令
13.4.2 全量同步
13.4.3 部分同步
13.4.4 部分同步的實現(xiàn)細節(jié)
13.5 PSYNC2
13.5.1 從節(jié)點重啟
13.5.2 Cluster故障轉(zhuǎn)移
13.6 主從復(fù)制流程
13.7 定時邏輯
13.8 主從復(fù)制配置
第4部分 分布式架構(gòu)
第14章 Raft算法
14.1 分布式一致性的難點
14.2 CAP理論
14.3 Raft算法的設(shè)計
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的實現(xiàn)原理
15.2.1 定義
15.2.2 Sentinel節(jié)點啟動
15.2.3 Sentinel機制的主邏輯
15.2.4 Sentinel節(jié)點建立網(wǎng)絡(luò)連接
15.2.5 Sentinel機制的定時消息
15.3 Redis Sentinel的故障轉(zhuǎn)移
15.3.1 主觀下線
15.3.2 客觀下線
15.3.3 開始故障轉(zhuǎn)移
15.3.4 選舉leader節(jié)點
15.3.5 故障轉(zhuǎn)移狀態(tài)機
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 重定向的實現(xiàn)
16.2.3 槽位遷移的實現(xiàn)
16.3 Redis Cluster啟動過程
16.3.1 節(jié)點啟動
16.3.2 節(jié)點握手
16.3.3 指派槽位
16.3.4 建立主從關(guān)系
16.4 Redis Cluster節(jié)點通信
16.4.1 Gossip算法
16.4.2 消息定義
16.4.3 建立連接
16.4.4 握手過程
16.4.5 定時消息
16.5 Redis Cluster的故障轉(zhuǎn)移
16.5.1 節(jié)點下線
16.5.2 選舉過程
16.5.3 從節(jié)點晉升
16.5.4 更新集群信息
16.5.5 建立主從關(guān)系
第5部分 高級特性
第17章 事務(wù)
17.1 事務(wù)的應(yīng)用示例
17.2 事務(wù)的實現(xiàn)原理
17.2.1 WATCH命令的實現(xiàn)
17.2.2 MULTI、EXEC命令的實現(xiàn)
第18章 非阻塞刪除
18.1 UNLINK命令的實現(xiàn)原理
18.2 后臺線程
18.2.1 條件變量
18.2.2 后臺線程的實現(xiàn)
第19章 內(nèi)存管理
19.1 動態(tài)內(nèi)存分配器
19.1.1 內(nèi)存分配器概述
19.1.2 Jemalloc設(shè)計概述
19.1.3 碎片整理機制
19.2 數(shù)據(jù)過期機制
19.2.1 定時刪除
19.2.2 惰性刪除
19.3 數(shù)據(jù)淘汰機制
19.3.1 LRU時間戳
19.3.2 LFU計數(shù)
19.3.3 數(shù)據(jù)淘汰算法
第20章 Redis Stream
20.1 Redis Stream的應(yīng)用示例
20.1.1 添加、讀取消息
20.1.2 消費組
20.1.3 ACK確認
20.1.4 刪除消息
20.2 Stream的實現(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的實現(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的實現(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實現(xiàn)數(shù)據(jù)類型
23.1.5 腳本超時
23.2 Lua腳本的實現(xiàn)原理
23.2.1 Lua與C語言交互
23.2.2 Redis中的Lua
第24章 Redis Module
24.1 Module的應(yīng)用示例
24.1.1 使用Module實現(xiàn)數(shù)據(jù)類型
24.1.2 Module API
24.1.3 Module的特性
24.2 Module的實現(xiàn)原理
24.2.1 C語言動態(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)存自動管理
24.2.7 調(diào)用Redis命令
24.2.8 自定義數(shù)據(jù)類型