3dwoo大學簡體電腦書店
Redis核心原理與實踐
( 簡體 字)
作者:梁國斌類別:1. -> 資料庫 -> Redis
出版社:電子工業出版社Redis核心原理與實踐 3dWoo書號: 55049
詢問書籍請說出此書號!
有庫存
NT售價: 690
出版日:7/1/2021
頁數:468
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121415487 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第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 自定義數據類型
本書深入地分析了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是開源的key-value存儲系統,可作為數據庫、緩存、消息組件。Redis的作者是Salvatore Sanfilippo(網名為antirez),他在2009年開發完成并開源了Redis。Redis由于性能極高、功能強大,迅速在業界流行,現已成為高并發系統中最常用的組件之一。
Redis提供了多種類型的數據結構,如字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。Redis還是分布式系統,主從集群可以實現數據熱備份,哨兵(Sentinel)機制可以保證主從集群高可用,Cluster集群則提供了水平擴展的能力。Redis還提供了持久化、Lua腳本、Module模塊、Stream消息流、Tracking機制等一系統強大功能,適用于各種業務場景。
寫作目的
雖然筆者主要使用Java語言開發程序,卻一直希望從源碼層面深入分析一個C語言實現的分布式系統。C語言可以說是最接近低級語言的開發語言,分析C語言程序,可以讓我們更深入地理解操作系統的底層知識。于是,筆者學習了Redis源碼,并編寫了本書。
為什么選擇Redis呢?因為Redis是一個典型的“小而美”的程序。Redis實現簡單,源碼非常優雅簡潔,閱讀起來并不吃力,而且Redis功能齊全,涵蓋了數據存儲、分布式、消息流等眾多特性,非常值得深入學習。
通過編寫本書,筆者對Redis、UNIX編程、分布式系統、存儲系統都有了更深入的理解,再學習其他相關的系統(如MySQL、Nginx等),就可以舉一反三、觸類旁通。希望本書也可以幫助讀者百尺竿頭,更進一步。
本書特點
本書深入分析了Redis的實現原理,所以并不是Redis的入門書。為了盡量降低閱讀難度,本書總結了Redis各個核心功能的實現原理,提取了Redis核心代碼(本書會盡量避免堆積代碼),并以適量圖文,對Redis源碼及其實現原理進行詳細分析,向讀者展示Redis核心功能的設計思想和實現流程。
雖然本書的大部分內容基于對Redis源碼的分析,但是并不復雜,即使讀者只是簡單了解C語言的基礎語法,也可以輕松讀懂。
另外,本書結合Redis目前的最新版本6.0.9,分析了Redis最新特性,如Redis 6的ACL、Tracking等機制。為了照顧對Redis最新特性不熟悉的讀者,這部分內容提供了詳細的應用示例,幫助讀者循序漸進、由淺到深地學習和理解Redis最新特性。
本書也不局限于Redis,而是由Redis延展出了兩方面內容:
(1)Redis中使用的UNIX機制,包括UNIX網絡編程、線程同步等內容,本書會通過源碼展示Redis如何使用這些UNIX機制。
(2)如何通過Redis實現一個分布式系統,主要是Sentinel、Cluster機制的實現原理。
本書使用的源碼版本是Redis 6.0.9,本書提供的Redis操作案例,如無特殊說明,也是在Redis 6.0.9版本上執行的操作實例。
本書結構
第1部分分析了Redis的字符串、列表、散列、集合這幾種數據類型的編碼格式。編碼格式,即數據的存儲格式,對于數據庫,數據的存儲格式至關重要,如關系型數據庫的行式存儲和列式存儲。而Redis作為內存數據庫,對于數據編碼的總體設計思想是:最大限度地“以時間換空間”,從而最大限度地節省內存。這部分內容詳細分析了Redis對內存的使用如何達到“錙銖必較”的程度。
第2部分分析了Redis的核心流程,包括Redis事件機制與命令執行過程。Redis利用I/O復用模型,實現了自己的事件循環機制,而Redis底層由該事件機制驅動運行(很多遠程服務程序都使用類似的架構,如Nginx、MySQL等)。Redis事件機制設計優雅、實現簡單,并且性能卓越,可以說是“化繁為簡”。
第3部分分析了Redis持久化與復制機制。雖然Redis是內存數據庫,但仍然最大限度地保證了數據的可靠性。不管是文件持久化,還是從節點復制,核心思想都是一樣的:通過將數據復制到不同備份中,從而保持數據安全。這部分內容分析了RDB、AOF持久化機制,以及主從節點復制流程等內容,向讀者展示了Redis數據是如何“不脛而走”的。
第4部分分析了Redis分布式架構。這部分內容從流行的分布式算法Raft出發,分析了Sentienl如何監控節點,Cluster集群如何實現數據分片,如何支持動態新增、刪除集群節點,以及它們的“拿手好戲”——故障轉移。分布式系統常常讓筆者想到一個有趣的詞—鐵索連舟(將集群節點想象為“舟”,將節點之間的網絡連接想象為“索”)。
第5部分分析了Redis中的高級特性,包括Redis事務、非阻塞刪除、ACL訪問控制列表、Tracking機制、Lua腳本、Module模塊、Stream消息流等內容。Redis為各種高性能、高可用場景提供了非常全面的支持,可以說是“包羅萬象”。
本書不是Redis工具書,并沒有將Redis的全部功能都分析一遍,很多功能也非常有趣實用,但本書不會深入討論,如Bitmaps、Hyperloglog、Geo、Pub/Sub等,讀者可以自行深入學習。
表達約定
(1)本書會按順序在源碼函數(或代碼塊)中添加標志,并在源碼展示結束后,按標志對源碼進行說明,例如:

robj *tryObjectEncoding(robj *o) {
...

// [1]
if (o->refcount > 1) return o;
...
}

【1】該redisObject被多處引用,不再進行編碼操作,以免影響他處的使用,直接退出函數。

這樣可以保證源碼展示的整潔,也方便讀者閱讀源碼后,再結合書中說明,深入理解。
另外,也方便讀者在閱讀本書時,結合閱讀完整的Redis源碼。
在源碼中使用“...”代表此處省略了代碼(有些地方省略了日志等輔助的代碼,可能不添加“...”標志)。
(2)如果源碼中函數太長,為了版面整潔,本書將其劃分為多個代碼段,并使用“// more”標志該函數后續還有其他代碼段,請讀者留意該標志。
勘誤和支持
在閱讀本書的過程中有任何問題或者建議,可以關注公眾號(binecy)與筆者交流。筆者十分感謝并重視您的反饋,會對您提出的問題、建議進行梳理與反饋,并在本書后續版本中及時做出勘誤與更新。
致謝
感謝寫作過程中身邊朋友的支持,他們給予筆者很多的力量。
感謝Redis的作者antirez,優秀的Redis離不開antirez的辛勤付出,向他致敬。
感謝電子工業出版社博文視點的陳曉猛編輯,陳編輯專業的寫作指導和出版組織工作,使得本書得以順利出版。
感謝計算機行業的內容創作者,他們的各種分享、博客文章及圖書都在積極推動行業的發展,也為本書的編寫提供了靈感和參考。

梁國斌
pagetop