Redis 設(shè)計(jì)與實(shí)現(xiàn)(第一版)

2018-08-02 11:39 更新

Redis 設(shè)計(jì)與實(shí)現(xiàn)(第一版)

你正在閱讀的是《Redis 設(shè)計(jì)與實(shí)現(xiàn)》第一版(舊版),請?jiān)L問 RedisBook.com ,查看關(guān)注 Redis 3.0 、包含更多新內(nèi)容的新版《Redis 設(shè)計(jì)與實(shí)現(xiàn)》。

本書的目標(biāo)是以簡明易懂的方式講解 Redis 的內(nèi)部運(yùn)行機(jī)制,通過閱讀本書,你可以了解到 Redis 從數(shù)據(jù)結(jié)構(gòu)到服務(wù)器構(gòu)造在內(nèi)的幾乎所有知識。

為了保證內(nèi)容的簡潔性,本書會盡量以高抽象層次的角度來觀察 Redis ,并將代碼的細(xì)節(jié)留給讀者自己去考究。

如果讀者只是對 Redis 的內(nèi)部運(yùn)作機(jī)制感興趣,但并不想深入代碼,那么只閱讀本書就足夠了。

另一方面,對于需要深入研究 Redis 代碼的讀者,本書附帶了一份 帶有詳細(xì)注釋的 Redis 2.6 源代碼 ,可以配合本書一并使用。

第一部分:內(nèi)部數(shù)據(jù)結(jié)構(gòu)

Redis 和其他很多 key-value 數(shù)據(jù)庫的不同之處在于,Redis 不僅支持簡單的字符串鍵值對,它還提供了一系列數(shù)據(jù)結(jié)構(gòu)類型值,比如列表、哈希、集合和有序集,并在這些數(shù)據(jù)結(jié)構(gòu)類型上定義了一套強(qiáng)大的 API 。

通過對不同類型的值進(jìn)行操作,Redis 可以很輕易地完成其他只支持字符串鍵值對的 key-value 數(shù)據(jù)庫很難(或者無法)完成的任務(wù)。

在 Redis 的內(nèi)部,數(shù)據(jù)結(jié)構(gòu)類型值由高效的數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行支持,并且在 Redis 自身的構(gòu)建當(dāng)中,也大量用到了這些數(shù)據(jù)結(jié)構(gòu)。

這一部分將對 Redis 內(nèi)存所使用的數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行介紹。

第二部分:內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)

雖然內(nèi)部數(shù)據(jù)結(jié)構(gòu)非常強(qiáng)大,但是創(chuàng)建一系列完整的數(shù)據(jù)結(jié)構(gòu)本身也是一件相當(dāng)耗費(fèi)內(nèi)存的工作,當(dāng)一個對象包含的元素?cái)?shù)量并不多,或者元素本身的體積并不大時,使用代價高昂的內(nèi)部數(shù)據(jù)結(jié)構(gòu)并不是最好的辦法。

為了解決這一問題,Redis 在條件允許的情況下,會使用內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)來代替內(nèi)部數(shù)據(jù)結(jié)構(gòu)。

內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)是一系列經(jīng)過特殊編碼的字節(jié)序列,創(chuàng)建它們所消耗的內(nèi)存通常比作用類似的內(nèi)部數(shù)據(jù)結(jié)構(gòu)要少得多,如果使用得當(dāng),內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)可以為用戶節(jié)省大量的內(nèi)存。

不過,因?yàn)閮?nèi)存映射數(shù)據(jù)結(jié)構(gòu)的編碼和操作方式要比內(nèi)部數(shù)據(jù)結(jié)構(gòu)要復(fù)雜得多,所以內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)所占用的 CPU 時間會比作用類似的內(nèi)部數(shù)據(jù)結(jié)構(gòu)要多。

這一部分將對 Redis 目前正在使用的兩種內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)進(jìn)行介紹。

第三部分:Redis 數(shù)據(jù)類型

既然 Redis 的鍵值對可以保存不同類型的值,那么很自然就需要對鍵值的類型進(jìn)行檢查以及多態(tài)處理。

為了讓基于類型的操作更加方便地執(zhí)行,Redis 創(chuàng)建了自己的類型系統(tǒng)。

在這一部分,我們將對 Redis 所使用的對象系統(tǒng)進(jìn)行了解,并分別觀察字符串、哈希表、列表、集合和有序集類型的底層實(shí)現(xiàn)。

第四部分:功能的實(shí)現(xiàn)

除了針對單個鍵值對的操作外,Redis 還提供了一些同時對多個鍵值對進(jìn)行處理的功能,比如事務(wù)和 Lua 腳本。

另外,一些輔助性的功能,比如慢查詢,以及一些和數(shù)據(jù)庫無關(guān)的功能,比如訂閱與發(fā)布,我們也會經(jīng)常用到。

通過理解這些功能的底層實(shí)現(xiàn),我們可以更有效地使用它們。

這一部分將對這些功能進(jìn)行介紹。

第五部分:內(nèi)部運(yùn)作機(jī)制

以下章節(jié)將對 Redis 最底層也最隱蔽的模塊進(jìn)行探討:

  • Redis 如何表示一個數(shù)據(jù)庫?數(shù)據(jù)庫操作是如何實(shí)現(xiàn)的?
  • Redis 如何進(jìn)行持久化? RDB 模式和 AOF 模式有什么區(qū)別?
  • Redis 如何處理輸入命令?它又是如何將輸出返回給客戶端的?
  • Redis 服務(wù)器如何初始化?傳入服務(wù)器的命令又是以什么方法執(zhí)行的?

以上的這些問題,都是這一部分要解答的。

關(guān)于

本書由 huangz 編寫。

我在研究 Redis 源碼并創(chuàng)作本書的過程中獲得了極大的快樂,希望你在閱讀本書時也能有同感。

評論、問題、意見或建議都可以發(fā)表在本書自帶的 disqus 論壇里,也可以通過 豆瓣 、 微博Twitter 聯(lián)系我,我會盡可能地回復(fù)。

要獲得本書的最新動態(tài),請關(guān)注 redisbook 項(xiàng)目。

要了解編寫本書時用到的工具(源碼管理、文檔的生成和托管、圖片生成,等等),請閱讀 這篇文章 。

下載本書離線版本: pdf 格式html 格式

通過捐款支持本書

如果你喜歡這本《Redis 設(shè)計(jì)與實(shí)現(xiàn)》的話,可以通過捐款的方式,支持作者繼續(xù)更新本書:比如為本書修補(bǔ)漏洞、添加更多有趣的章節(jié),或者發(fā)行有更多更棒內(nèi)容的下一版,等等。

你可以通過使用支付寶錢包 掃描以下二維碼來進(jìn)行捐款,或者通過向支付寶帳號 huangz1990@gmail.com 轉(zhuǎn)帳來進(jìn)行捐款。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號