W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
時間回到 2011 年 4 月, 當(dāng)時我正在編寫一個用戶關(guān)系模塊, 這個模塊需要實(shí)現(xiàn)一個“共同關(guān)注”功能, 用于計算出兩個用戶關(guān)注了哪些相同的用戶。
舉個例子, 假設(shè) huangz 關(guān)注了 peter 、tom 、jack 三個用戶, 而 john 關(guān)注了 peter 、tom 、bob 、david 四個用戶, 那么當(dāng) huangz 訪問 john 的頁面時, 共同關(guān)注功能就會計算并打印出類似“你跟 john 都關(guān)注了 peter 和 tom ”這樣的信息。
從集合計算的角度來看, 共同關(guān)注功能本質(zhì)上就是計算兩個用戶關(guān)注集合的交集, 因?yàn)榻患@個概念是如此的常見, 所以我很自然地認(rèn)為共同關(guān)注這個功能可以很容易地實(shí)現(xiàn), 但現(xiàn)實(shí)卻給了我當(dāng)頭一棒: 我所使用的關(guān)系數(shù)據(jù)庫并不直接支持交集計算操作, 要計算兩個集合的交集, 除了需要對兩個數(shù)據(jù)表執(zhí)行合并(join)操作之外, 還需要對合并的結(jié)果執(zhí)行去重復(fù)(distinct)操作, 最終導(dǎo)致交集操作的實(shí)現(xiàn)變得異常復(fù)雜。
是否存在直接支持集合操作的數(shù)據(jù)庫呢? 帶著這個疑問, 我在搜索引擎上面進(jìn)行查找, 并最終發(fā)現(xiàn)了 Redis 。 在我看來, Redis 正是我想要找的那種數(shù)據(jù)庫 —— 它內(nèi)置了集合數(shù)據(jù)類型, 并支持對集合執(zhí)行交集、并集、差集等集合計算操作, 其中的交集計算操作可以直接用于實(shí)現(xiàn)我想要的共同關(guān)注功能。
得益于 Redis 本身的簡單性, 以及 Redis 手冊的詳盡和完善, 我很快學(xué)會了怎樣使用 Redis 的集合數(shù)據(jù)類型, 并用它重新實(shí)現(xiàn)了整個用戶關(guān)系模塊: 重寫之后的關(guān)系模塊不僅代碼量更少, 速度更快, 更重要的是, 之前需要使用一段甚至一大段 SQL 查詢才能實(shí)現(xiàn)的功能, 現(xiàn)在只需要調(diào)用一兩個 Redis 命令就能夠?qū)崿F(xiàn)了, 整個模塊的可讀性得到了極大的提高。
自此之后, 我開始在越來越多的項(xiàng)目里面使用 Redis , 與此同時, 我對 Redis 的內(nèi)部實(shí)現(xiàn)也越來越感興趣, 一些問題開始頻繁地出現(xiàn)在我的腦海中, 比如說:
"hello world"
), 又可以儲存整數(shù)和浮點(diǎn)數(shù)(比如 10086
和 3.14
), 甚至是二進(jìn)制位(使用 SETBIT 等命令), Redis 在內(nèi)部是怎樣儲存這些不同的值的?為了找到這些問題的答案, 我再次在搜索引擎上面進(jìn)行查找, 可惜的是這次搜索并沒有多少收獲: Redis 還是一個非常年輕的軟件, 對它的最好介紹就是官方網(wǎng)站上面的文檔, 但是這些文檔主要關(guān)注的是怎樣使用 Redis , 而不是介紹 Redis 的內(nèi)部實(shí)現(xiàn)。 另外, 網(wǎng)上雖然有一些博客文章對 Redis 的內(nèi)部實(shí)現(xiàn)進(jìn)行了介紹, 但這些文章要么并不齊全(只介紹了 Redis 中的少數(shù)幾個特性), 要么就寫得過于簡單(只是一些概述性的文章), 要么關(guān)注的就是舊版本(比如 2.0 、 2.2 或者 2.4 ,而當(dāng)時的最新版已經(jīng)是 2.6 了)。
綜合來看, 詳細(xì)而且完整地介紹 Redis 內(nèi)部實(shí)現(xiàn)的資料, 無論是外文還是中文都不存在。 意識到這一點(diǎn)之后, 我決定自己動手注釋 Redis 的源代碼, 從中尋找問題的答案, 并通過寫博客的方式與其他 Redis 用戶分享我的發(fā)現(xiàn)。 在積累了七八篇 Redis 源代碼注釋文章之后, 我想如果能將這些博文匯集成書的話, 那一定會非常有趣, 并且我自己也會從中學(xué)到很多知識。 于是我在 2012 年年末開始創(chuàng)作《Redis 設(shè)計與實(shí)現(xiàn)》, 并最終于 2013 年 3 月 8 日在互聯(lián)網(wǎng)發(fā)布了本書的第一版。
盡管《Redis 設(shè)計與實(shí)現(xiàn)》第一版順利發(fā)布了, 但在我的心目中, 這個第一版還是有很多不完善的地方:
就在我考慮應(yīng)該何時編寫新版來修復(fù)這些缺陷的時候, 機(jī)械工業(yè)出版社的吳怡編輯來信詢問我是否有興趣正式地出版《Redis 設(shè)計與實(shí)現(xiàn)》, 能夠正式地出版自己寫的書一直是我夢寐以求的事情, 我找不到任何拒絕這一邀請的理由, 就這樣, 在《Redis 設(shè)計與實(shí)現(xiàn)》第一版發(fā)布幾天之后, 新版《Redis 設(shè)計與實(shí)現(xiàn)》的寫作也馬不停蹄地開始了。
從 2013 年 3 月到 2014 年 1 月這 11 個月間, 我重新注釋了 Redis 在 unstable 分支的源代碼(也即是現(xiàn)在的 Redis 3.0 源代碼), 重寫了《Redis 設(shè)計與實(shí)現(xiàn)》第一版已有的所有章節(jié), 并向書中添加了關(guān)于二進(jìn)制位操作(bitop)、排序、復(fù)制、Sentinel 和集群等主題的新章節(jié), 最終, 這本新版的《Redis 設(shè)計與實(shí)現(xiàn)》不僅介紹了 Redis 的內(nèi)部機(jī)制 (比如數(shù)據(jù)庫實(shí)現(xiàn)、類型系統(tǒng)、事件模型), 而且還介紹了大部分 Redis 單機(jī)特性 (比如事務(wù)、持久化、 Lua 腳本、排序、二進(jìn)制位操作), 以及所有 Redis 多機(jī)特性 (復(fù)制、Sentinel 和集群)。
雖然作者創(chuàng)作本書的初衷只是為了滿足自己的好奇心, 但了解 Redis 內(nèi)部實(shí)現(xiàn)的好處并不僅僅在于滿足好奇心: 通過了解 Redis 的內(nèi)部實(shí)現(xiàn), 理解每一個特性和命令背后的運(yùn)作機(jī)制, 可以幫助我們更高效地使用 Redis , 避開那些可能會引起性能問題的陷阱。 我衷心希望這本新版《Redis 設(shè)計與實(shí)現(xiàn)》能夠幫助讀者更好地了解 Redis , 并成為更優(yōu)秀的 Redis 使用者。
本書的第一版獲得了很多熱心讀者的反饋, 這本新版的很多改進(jìn)也來源于讀者們的意見和建議, 因此我將繼續(xù)在 www.RedisBook.com 設(shè)置 disqus 論壇(可以不注冊直接發(fā)貼), 歡迎讀者隨時就這本新版《Redis 設(shè)計與實(shí)現(xiàn)》發(fā)表提問、意見、建議、批評、勘誤,等等, 我會努力地采納大家的意見, 爭取在將來寫出更好的《Redis 設(shè)計與實(shí)現(xiàn)》, 以此來回報大家對本書的支持。
黃健宏(huangz)
2014 年 3 月于清遠(yuǎn)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: