前言
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等),就可以舉一反三、觸類旁通。希望本書也可以幫助讀者百尺竿頭,更進一步。
▍本書結構
第1部分分析了Redis的字串、清單、雜湊、集合這幾種資料類型的編碼格式。編碼格式,即資料的儲存格式,對於資料庫,資料的儲存格式非常重要,如關聯式資料庫的行式儲存和列式儲存。而Redis作為記憶體中資料庫,對於資料編碼的整體設計思想是:最大限度地「以時間換空間」,從而最大限度地節省記憶體。這部分內容詳細分析了Redis對記憶體的使用如何達到「錙銖必較」的程度。
第2部分分析了Redis的核心流程,包括Redis事件機制與命令執行過程。Redis利用I/O重複使用模型,實現了自己的事件循環機制,而Redis底層由該事件機制驅動運行(很多遠端服務程式都使用類似的架構,如Nginx、MySQL等)。Redis事件機制設計優雅、實現簡單,並且性能卓越,可以說是「化繁為簡」。
第3部分分析了Redis持久化與複製機制。雖然Redis是記憶體中資料庫,但仍然最大限度地保證了資料的可靠性。不管是檔案持久化,還是從節點複製,核心思想都是一樣的:透過將資料複製到不同備份中,從而保持資料安全。這部分內容分析了RDB、AOF持久化機制,以及主從節點複製流程等內容,介紹了Redis資料是如何「不脛而走」的。
第4部分分析了Redis分散式架構。這部分內容從流行的分散式演算法Raft出發,分析了Sentinel如何監控節點,Cluster叢集如何實現資料分片,如何支援動態新增、刪除叢集節點,以及它們的「拿手好戲」——容錯移轉。
第5部分分析了Redis中的進階特性,包括Redis交易、非阻塞刪除、ACL存取控制清單、Tracking機制、Lua指令稿、Module模組、Stream訊息流等內容。Redis為各種高性能、高可用場景提供了非常全面的支援,可以說是「包羅萬象」。
▍致謝
感謝寫作過程中身邊朋友的支持,他們給予筆者很多的力量。感謝Redis的作者antirez,優秀的Redis離不開antirez的辛勤付出,向他致敬。感謝電子工業出版社博文視點的陳曉猛編輯,陳編輯專業的寫作指導和出版組織工作,使得本書得以順利出版。感謝電腦產業的內容創作者,他們的各種分享、網誌文章及圖書都在積極推動產業的發展,也為本書的編寫提供了靈感和參考。
梁國斌