-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Redis設計與實現

( 簡體 字)
作者:黃健宏 著類別:1. -> 資料庫 -> Redis
譯者:
出版社:機械工業出版社Redis設計與實現 3dWoo書號: 38756
詢問書籍請說出此書號!

缺書
NT售價: 395

出版日:6/1/2014
頁數:388
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111464747
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

2011年4月,當時我正在編寫一個用戶關系模塊,這個模塊需要實現一個“共同關注”功能,用于計算出兩個用戶關注了哪些相同的用戶。

舉個例子,假設huangz關注了peter、tom、jack三個用戶,而john關注了peter、tom、bob、david四個用戶,那么當huangz訪問john的頁面時,共同關注功能就會計算并打印出類似“你跟john都關注了peter和tom”這樣的信息。

從集合計算的角度來看,共同關注功能本質上就是計算兩個用戶關注集合的交集,因為交集這個概念是如此的常見,所以我很自然地認為共同關注這個功能可以很容易地實現,但現實卻給了我當頭一棒:我所使用的關系數據庫并不直接支持交集計算操作,要計算兩個集合的交集,除了需要對兩個數據表執行合并(join)操作之外,還需要對合并的結果執行去重復(distinct)操作,最終導致交集操作的實現變得異常復雜。

是否存在直接支持集合操作的數據庫呢?帶著這個疑問,我在搜索引擎上面進行查找,并最終發現了Redis。在我看來,Redis正是我想要找的那種數據庫——它內置了集合數據類型,并支持對集合執行交集、并集、差集等集合計算操作,其中的交集計算操作可以直接用于實現我想要的共同關注功能。

得益于Redis本身的簡單性,以及Redis手冊的詳盡和完善,我很快學會了怎樣使用Redis的集合數據類型,并用它重新實現了整個用戶關系模塊:重寫之后的關系模塊不僅代碼量更少,速度更快,更重要的是,之前需要使用一段甚至一大段SQL查詢才能實現的功能,現在只需要調用一兩個Redis命令就能夠實現了,整個模塊的可讀性得到了極大的提高。

自此之后,我開始在越來越多的項目里面使用Redis,與此同時,我對Redis的內部實現也越來越感興趣,一些問題開始頻繁地出現在我的腦海中,比如:

??Redis的五種數據類型分別是由什么數據結構實現的?

??Redis的字符串數據類型既可以存儲字符串(比如"hello world"),又可以存儲整數和浮點數(比如10086和3.14),甚至是二進制位(使用SETBIT等命令),Redis在內部是怎樣存儲這些值的?

??Redis的一部分命令只能對特定數據類型執行(比如APPEND只能對字符串執行,HSET只能對哈希表執行),而另一部分命令卻可以對所有數據類型執行(比如DEL、TYPE和EXPIRE),不同的命令在執行時是如何進行類型檢查的?Redis在內部是否實現了一個類型系統?

??Redis的數據庫是怎樣存儲各種不同數據類型的鍵值對的?數據庫里面的過期鍵又是怎樣實現自動刪除的?

??除了數據庫之外,Redis還擁有發布與訂閱、腳本、事務等特性,這些特性又是如何實現的?

??Redis使用什么模型或者模式來處理客戶端的命令請求?一條命令請求從發送到返回需要經過什么步驟?

為了找到這些問題的答案,我再次在搜索引擎上面進行查找,可惜的是這次搜索并沒有多少收獲:Redis還是一個非常年輕的軟件,對它的最好介紹就是官方網站上面的文檔,但是這些文檔主要關注的是怎樣使用Redis,而不是介紹Redis的內部實現。另外,網上雖然有一些博客文章對Redis的內部實現進行了介紹,但這些文章要么不齊全(只介紹了Redis中的少數幾個特性),要么就寫得過于簡單(只是一些概述性的文章),要么關注的就是舊版本(比如2.0、2.2或者2.4,而當時的最新版已經是2.6了)。

綜合來看,詳細而且完整地介紹Redis內部實現的資料,無論是外文還是中文都不存在。意識到這一點之后,我決定自己動手注釋Redis的源代碼,從中尋找問題的答案,并通過寫博客的方式與其他Redis用戶分享我的發現。在積累了七八篇Redis源代碼注釋文章之后,我想如果能將這些博文匯集成書的話,那一定會非常有趣,并且我自己也會從中學到很多知識。于是我在2012年年末開始創作《Redis設計與實現》,并最終于2013年3月8日在互聯網發布了本書的第一版。

盡管《Redis設計與實現》第一版順利發布了,但在我的心目中,這個第一版還是有很多不完善的地方:

??比如說,因為第一版是我邊注釋Redis源代碼邊寫的,如果有足夠時間讓我先完整地注釋一遍Redis的源代碼,然后再進行寫作的話,那么書本在內容方面應該會更為全面。

??又比如說,第一版只介紹了Redis的內部機制和單機特性,但并沒有介紹Redis多機特性,而我認為只有將關于多機特性的介紹也包含進來,這本《Redis設計與實現》才算是真正的完成了。

就在我考慮應該何時編寫新版來修復這些缺陷的時候,機械工業出版社的吳怡編輯來信詢問我是否有興趣正式地出版《Redis設計與實現》,能夠正式地出版自己寫的書一直是我夢寐以求的事情,我找不到任何拒絕這一邀請的理由,就這樣,在《Redis設計與實現》第一版發布幾天之后,新版《Redis設計與實現》的寫作也馬不停蹄地開始了。

從2013年3月到2014年1月這11個月間,我重新注釋了Redis在unstable分支的源代碼(也即是現在的Redis 3.0源代碼),重寫了《Redis設計與實現》第一版已有的所有章節,并向書中添加了關于二進制位操作(bitop)、排序、復制、Sentinel和集群等主題的新章節,最終完成了這本新版的《Redis 設計與實現》。本書不僅介紹了Redis的內部機制(比如數據庫實現、類型系統、事件模型),而且還介紹了大部分Redis單機特性(比如事務、持久化、Lua腳本、排序、二進制位操作),以及所有Redis多機特性(如復制、Sentinel和集群)。

雖然作者創作本書的初衷只是為了滿足自己的好奇心,但了解Redis內部實現的好處并不僅僅在于滿足好奇心:通過了解Redis的內部實現,理解每一個特性和命令背后的運作機制,可以幫助我們更高效地使用Redis,避開那些可能會引起性能問題的陷阱。我衷心希望這本新版《Redis設計與實現》能夠幫助讀者更好地了解Redis,并成為更優秀的Redis使用者。

本書的第一版獲得了很多熱心讀者的反饋,這本新版的很多改進也來源于讀者們的意見和建議,因此我將繼續在www.RedisBook.com設置disqus論壇(可以不注冊直接發貼),歡迎讀者隨時就這本新版《Redis設計與實現》發表提問、意見、建議、批評、勘誤,等等,我會努力地采納大家的意見,爭取在將來寫出更好的《Redis設計與實現》,以此來回報大家對本書的支持。



黃健宏(huangz)

2014年3月于清遠
內容簡介:

全面而完整地講解了Redis的內部機制與實現方式,對Redis的大多數單機功能以及所有多機功能的實現原理進行了介紹,展示了這些功能的核心數據結構以及關鍵的算法思想,圖示豐富,描述清晰,并給出大量參考信息。通過閱讀本書,讀者可以快速、有效地了解Redis的內部構造以及運作機制,更好、更高效地使用Redis。

本書主要分為四大部分。第一部分“數據結構與對象”介紹了Redis中的各種對象及其數據結構,并說明這些數據結構如何影響對象的功能和性能。第二部分“單機數據庫的實現”對Redis實現單機數據庫的方法進行了介紹,包括數據庫、RDB持久化、AOF持久化、事件等。第三部分“多機數據庫的實現”對Redis的Sentinel、復制、集群三個多機功能進行了介紹。第四部分“獨立功能的實現”對Redis中各個相對獨立的功能模塊進行了介紹,涉及發布與訂閱、事務、Lua腳本、排序、二進制位數組、慢查詢日志、監視器等。本書作者專門維護了www.redisbook.com網站,提供帶有詳細注釋的Redis源代碼,以及本書相關的更新內容。
目錄:

前言

致謝

第1章?引言 1

1.1?Redis版本說明 1

1.2?章節編排 1

1.3?推薦的閱讀方法 4

1.4?行文規則 4

1.5?配套網站 5

第一部分?數據結構與對象

第2章?簡單動態字符串 8

2.1?SDS的定義 9

2.2?SDS與C字符串的區別 10

2.3?SDS API 17

2.4?重點回顧 18

2.5?參考資料 18

第3章?鏈表 19

3.1?鏈表和鏈表節點的實現 20

3.2?鏈表和鏈表節點的API 21

3.3?重點回顧 22

第4章?字典 23

4.1?字典的實現 24

4.2?哈希算法 27

4.3?解決鍵沖突 28

4.4?rehash 29

4.5?漸進式rehash 32

4.6?字典API 36

4.7?重點回顧 37

第5章?跳躍表 38

5.1?跳躍表的實現 39

5.2?跳躍表API 44

5.3?重點回顧 45

第6章?整數集合 46

6.1?整數集合的實現 46

6.2?升級 48

6.3?升級的好處 50

6.4?降級 51

6.5?整數集合API 51

6.6?重點回顧 51

第7章?壓縮列表 52

7.1?壓縮列表的構成 52

7.2?壓縮列表節點的構成 54

7.3?連鎖更新 57

7.4?壓縮列表API 59

7.5?重點回顧 59

第8章?對象 60

8.1?對象的類型與編碼 60

8.2?字符串對象 64

8.3?列表對象 68

8.4?哈希對象 71

8.5?集合對象 75

8.6?有序集合對象 77

8.7?類型檢查與命令多態 81

8.8?內存回收 84

8.9?對象共享 85

8.10?對象的空轉時長 87

8.11?重點回顧 88

第二部分?單機數據庫的實現

第9章?數據庫 90

9.1?服務器中的數據庫 90

9.2?切換數據庫 91

9.3?數據庫鍵空間 93

9.4?設置鍵的生存時間或過期時間 99

9.5?過期鍵刪除策略 107

9.6?Redis的過期鍵刪除策略 108

9.7?AOF、RDB和復制功能對過期鍵的處理 111

9.8?數據庫通知 113

9.9?重點回顧 117

第10章?RDB持久化 118

10.1?RDB 文件的創建與載入 119

10.2?自動間隔性保存 121

10.3?RDB 文件結構 125

10.4?分析RDB文件 133

10.5?重點回顧 137

10.6?參考資料 137

第11章?AOF持久化 138

11.1?AOF持久化的實現 139

11.2?AOF文件的載入與數據還原 142

11.3?AOF重寫 143

11.4?重點回顧 150

第12章?事件 151

12.1?文件事件 151

12.2?時間事件 156

12.3?事件的調度與執行 159

12.4?重點回顧 161

12.5?參考資料 161

第13章?客戶端 162

13.1?客戶端屬性 163

13.2?客戶端的創建與關閉 172

13.3?重點回顧 174

第14章?服務器 176

14.1?命令請求的執行過程 176

14.2?serverCron函數 184

14.3?初始化服務器 192

14.4?重點回顧 196

第三部分?多機數據庫的實現

第15章?復制 198

15.1?舊版復制功能的實現 199

15.2?舊版復制功能的缺陷 201

15.3?新版復制功能的實現 203

15.4?部分重同步的實現 204

15.5?PSYNC 命令的實現 209

15.6?復制的實現 211

15.7?心跳檢測 216

15.8?重點回顧 218

第16章?Sentinel 219

16.1?啟動并初始化Sentinel 220

16.2?獲取主服務器信息 227

16.3?獲取從服務器信息 229

16.4?向主服務器和從服務器發送信息 230

16.5?接收來自主服務器和從服務器的頻道信息 231

16.6?檢測主觀下線狀態 234

16.7?檢查客觀下線狀態 236

16.8?選舉領頭Sentinel 238

16.9?故障轉移 240

16.10?重點回顧 243

16.11?參考資料 244

第17章?集群 245

17.1?節點 245

17.2?槽指派 251

17.3?在集群中執行命令 258

17.4?重新分片 265

17.5?ASK錯誤 267

17.6?復制與故障轉移 273

17.7?消息 281

17.8?重點回顧 288

第四部分?獨立功能的實現

第18章?發布與訂閱 290

18.1?頻道的訂閱與退訂 292

18.2?模式的訂閱與退訂 295

18.3?發送消息 298

18.4?查看訂閱信息 300

18.5?重點回顧 303

18.6?參考資料 304

第19章?事務 305

19.1?事務的實現 306

19.2?WATCH 命令的實現 310

19.3?事務的ACID 性質 314

19.4?重點回顧 319

19.5?參考資料 320

第20章?Lua腳本 321

20.1?創建并修改Lua 環境 322

20.2?Lua 環境協作組件 327

20.3?EVAL命令的實現 329

20.4?EVALSHA 命令的實現 332

20.5?腳本管理命令的實現 333

20.6?腳本復制 336

20.7?重點回顧 342

20.8?參考資料 343

第21章?排序 344

21.1?SORT 命令的實現 345

21.2?ALPHA 選項的實現 347

21.3?ASC 選項和DESC 選項的實現 348

21.4?BY選項的實現 350

21.5?帶有ALPHA 選項的BY 選項的實現 352

21.6?LIMIT 選項的實現 353

21.7?GET選項的實現 355

21.8?STORE 選項的實現 358

21.9?多個選項的執行順序 359

21.10?重點回顧 361

第22章?二進制位數組 362

22.1?位數組的表示 363

22.2?GETBIT命令的實現 365

22.3?SETBIT 命令的實現 366

22.4?BITCOUNT 命令的實現 369

22.5?BITOP 命令的實現 376

22.6?重點回顧 377

22.7?參考資料 377

第23章?慢查詢日志 378

23.1?慢查詢記錄的保存 380

23.2?慢查詢日志的閱覽和刪除 382

23.3?添加新日志 383

23.4?重點回顧 385

第24章?監視器 386

24.1?成為監視器 387

24.2?向監視器發送命令信息 387

24.3?重點回顧 388
序: