Redis 核心原理與實踐

梁國斌

買這商品的人也買了...

商品描述

本書深入地分析了Redis核心功能的內部機制與實現方式,大部分內容源自對Redis源碼的分析,並從中總結出實現原理。通過閱讀本書,讀者可以快速、輕松地瞭解Redis的內部運行機制。 本書首先介紹了Redis常用的數據類型的編碼格式,包括字符串、列表、散列、集合、有序集合,這是Redis存儲數據的基礎。接著分析了Redis的事件機制,剖析了Redis事件驅動的實現原理,通過這部分內容,讀者可以瞭解一個遠程服務程序的整體架構。本書還分析了Redis持久化、主從復制、Sentinel機制、Cluster機制的實現原理,這部分內容是Redis的核心功能。在這部分內容中,本書也會延伸分析Redis中使用的UNIX機制,如UNIX網絡編程、進程通信、線程同步等,並通過Redis源碼展示這些UNIX機制的使用方式。 本書最後介紹了Redis的高級特性,包括事務、非阻塞刪除、Lua腳本、Module模塊、Stream消息流,以及Redis 6提供的ACL訪問控制列表、Tracking機制等,這部分內容不僅分析內部實現,還提供了詳細的使用案例,幫助讀者循序漸進地瞭解這些特性。

作者簡介

多年軟件設計與開發經驗。 Redis長期使用者,熟悉Redis的核心原理與實現方式。公眾號(binecy)的維護者,主要分享各類軟件和框架的源碼分析。

目錄大綱

第1部分 數據結構與編碼
第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 字節序
2.1.3 操作分析
2.1.4 級聯更新
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 數據庫

第4章 集合
4.1 無序集合
4.1.1 定義
4.1.2 操作分析
4.1.3 編碼
4.2 有序集合
4.2.1 定義
4.2.2 操作分析
4.2.3 編碼

第2部分 事件機制與命令執行
第5章 Redis啟動過程
5.1 服務器定義
5.2 main函數
5.3 Redis初始化過程

第6章 事件機制
6.1 Redis事件機制概述
6.2 Redis啟動時創建的事件
6.3 事件循環器的運行

第7章 epoll與網絡通信
7.1 I/O復用模型
7.2 epoll網絡編程
7.3 Redis網絡通信啟動過程
7.3.1 Redis網絡服務
7.3.2 Redis中的epoll

第8章 客戶端
8.1 定義
8.2 創建客戶端
8.3 關閉客戶端
8.4 客戶端配置

第9章 Redis命令執行過程
9.1 RESP協議
9.2 解析請求
9.3 返迴響應
9.4 執行命令

第10章 網絡I/O線程
10.1 線程概述
10.2 互斥量概述
10.3 初始化I/O線程
10.4 解析請求
10.5 I/O線程主邏輯
10.6 返迴響應
10.7 I/O線程狀態切換

第3部分 持久化與復制
第11章 RDB
11.1 RDB定時邏輯
11.2 RDB持久化過程
11.2.1 fork子進程
11.2.2 生成RDB文件
11.2.3 寫入RDB數據
11.2.4 父進程收尾
11.3 RDB文件加載過程
11.4 RDB文件分析示例
11.5 RDB配置
11.6 UNIX寫時復制機制
11.7 UNIX I/O與緩存
11.7.1 內核緩衝區
11.7.2 I/O緩存區
11.7.3 sync與fdatasync

第12章 AOF
12.1 AOF定時邏輯
12.2 AOF持久化過程
12.2.1 命令傳播
12.2.2 刷新AOF緩衝區
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章 主從復制
13.1 流程概述
13.2 主從握手流程
13.2.1 處理REPLICAOF命令
13.2.2 主從連接
13.2.3 握手流程
13.3 從節點同步流程
13.3.1 發送PSYNC命令
13.3.2 部分同步
13.3.3 全量同步
13.4 主節點同步流程
13.4.1 處理PSYNC命令
13.4.2 全量同步
13.4.3 部分同步
13.4.4 部分同步的實現細節
13.5 PSYNC2
13.5.1 從節點重啟
13.5.2 Cluster故障轉移
13.6 主從復制流程
13.7 定時邏輯
13.8 主從復製配置

第4部分 分佈式架構
第14章 Raft算法
14.1 分佈式一致性的難點
14.2 CAP理論
14.3 Raft算法的設計
14.3.1 領導選舉
14.3.2 日誌複製
14.3.3 安全性
14.4 Redis中的Raft算法

第15章 Redis Sentinel
15.1 Redis Sentinel的應用示例
15.2 Redis Sentinel的實現原理
15.2.1 定義
15.2.2 Sentinel節點啟動
15.2.3 Sentinel機制的主邏輯
15.2.4 Sentinel節點建立網絡連接
15.2.5 Sentinel機制的定時消息
15.3 Redis Sentinel的故障轉移
15.3.1 主觀下線
15.3.2 客觀下線
15.3.3 開始故障轉移
15.3.4 選舉leader節點
15.3.5 故障轉移狀態機
15.4 客戶端交互

第16章 Redis Cluster
16.1 Redis Cluster的應用示例
16.1.1 搭建Redis Cluster集群
16.1.2 客戶端重定向
16.1.3 槽位遷移案例
16.2 Redis Cluster槽位管理
16.2.1 定義
16.2.2 重定向的實現
16.2.3 槽位遷移的實現
16.3 Redis Cluster啟動過程
16.3.1 節點啟動
16.3.2 節點握手
16.3.3 指派槽位
16.3.4 建立主從關係
16.4 Redis Cluster節點通信
16.4.1 Gossip算法
16.4.2 消息定義
16.4.3 建立連接
16.4.4 握手過程
16.4.5 定時消息
16.5 Redis Cluster的故障轉移
16.5.1 節點下線
16.5.2 選舉過程
16.5.3 從節點晉升
16.5.4 更新集群信息
16.5.5 建立主從關係

第5部分 高級特性
第17章 事務
17.1 事務的應用示例
17.2 事務的實現原理
17.2.1 WATCH命令的實現
17.2.2 MULTI、EXEC命令的實現

第18章 非阻塞刪除
18.1 UNLINK命令的實現原理
18.2 後台線程
18.2.1 條件變量
18.2.2 後台線程的實現

第19章 內存管理
19.1 動態內存分配器
19.1.1 內存分配器概述
19.1.2 Jemalloc設計概述
19.1.3 碎片整理機制
19.2 數據過期機制
19.2.1 定時刪除
19.2.2 惰性刪除
19.3 數據淘汰機制
19.3.1 LRU時間戳
19.3.2 LFU計數
19.3.3 數據淘汰算法

第20章 Redis Stream
20.1 Redis Stream的應用示例
20.1.1 添加、讀取消息
20.1.2 消費組
20.1.3 ACK確認
20.1.4 刪除消息
20.2 Stream的實現原理
20.2.1 listpack結構
20.2.2 Rax結構
20.2.3 Stream結構
20.2.4 Stream持久化與復制

第21章 訪問控制列表ACL
21.1 ACL的應用示例
21.1.1 創建用戶
21.1.2 可執行命令授權
21.1.3 可訪問鍵授權
21.1.4 Pub/Sub頻道授權
21.2 ACL的實現原理
21.2.1 定義
21.2.2 初始化ACL環境
21.2.3 用戶規則設置
21.2.4 用戶權限檢查

第22章 Redis Tracking
22.1 Redis Tracking的應用示例
22.1.1 基本應用
22.1.2 廣播模式
22.1.3 OPTIN、OPTOUT、NOLOOP
22.1.4 轉發模式
22.2 Redis Tracking的實現原理
22.2.1 RESP3協議
22.2.2 開啟Redis Tracking
22.2.3 記錄查詢鍵
22.2.4 非廣播模式下發送失效消息
22.2.5 廣播模式下發送失效消息
22.2.6 清除記錄鍵

第23章 Lua腳本
23.1 Lua腳本的應用示例
23.1.1 使用EVAL命令
23.1.2 redis. call函數
23.1.3 類型轉換
23.1.4 使用Lua實現數據類型
23.1.5 腳本超時
23.2 Lua腳本的實現原理
23.2.1 Lua與C語言交互
23.2.2 Redis中的Lua

第24章 Redis Module
24.1 Module的應用示例
24.1.1 使用Module實現數據類型
24.1.2 Module API
24.1.3 Module的特性
24.2 Module的實現原理
24.2.1 C語言動態庫
24.2.2 定義
24.2.3 初始化Module的執行環境
24.2.4 加載Module
24.2.5 創建Module命令
24.2.6 內存自動管理
24.2.7 調用Redis命令
24.2.8 自定義數據類型