前言
近年來,隨著Redis大熱并成為內存數據庫的事實標準,大量關于Redis的圖書也隨之涌現。
2023年,在決定創作并推出全新的Redis圖書之際,我對市面上已有的Redis圖書進行了一番調研,發現大多數Redis圖書關注的是命令、運維、架構、源碼分析等方面的內容,而對實際應用只是一筆帶過,或者在介紹命令時做錦上添花之用,很少有圖書愿意詳細地介紹使用Redis的應用實例。
然而,對Redis的大量使用導致網上關于Redis使用方法的各種問題越來越頻繁地出現:如何使用Redis實現鎖?如何使用Redis實現消息隊列?如何使用Redis表示好友關系?如何使用Redis存儲地理位置數據?隨便去哪一個Redis社區,都會看到大量類似的問題。
考慮到這一點,我決定編寫本書。書中包含32個精挑細選的經典Redis應用實例,如緩存、鎖、計數器、消息隊列、自動補全、社交關系、排行榜、先進先出隊列等,這些實例無一不是我們日常開發中經常會遇到的,而且往往也是網上咨詢最多的。
我希望通過在書中展示常見的Redis應用實例來幫助讀者了解使用Redis解決各類問題的方法,并加深讀者對Redis各項命令及數據結構的認識,使讀者真正成為能夠使用Redis解決各類問題的Redis專家。
內容編排
本書通過大量Redis應用實例來展示Redis的經典用法與用例,全書分為3個部分,共32章。
第一部分講內部組件。這個部分介紹的實例通常用于系統內部,如緩存、鎖、計數器、迭代器、速率限制器等,這些都是很多系統中不可或缺的部分。通過學習如何使用Redis構建這些組件,并使用它們代替系統原有的低效組件,讀者將能夠大幅地提升系統的整體性能。
第二部分講外部應用。這個部分介紹的實例都是一些日常常見的、用戶可以直接接觸到的應用,如直播彈幕、社交關系、排行榜、分頁、地理位置等。通過學習如何使用Redis構建這些應用,讀者將能夠進一步地了解到Redis各個數據結構和命令的強大之處,還能夠在實例應用已有功能的基礎上,按需擴展出自己想要的其他功能。
第三部分講數據結構。這個部分介紹的實例是一些使用Redis實現的常見數據結構,如先進先出隊列、棧、優先隊列和矩陣等。在需要快速、可靠的內存存儲數據結構時,這些數據結構可以作為其他程序的底層數據結構或者基本構件使用。
除少數章引用了其他章的代碼或內容之外,本書的大部分章都自成一體、可以獨立閱讀,讀者可以按需閱讀自己感興趣的任意章。
當然,如果讀者只是想要學習Redis的多種使用方法,并無特別喜好,也可以像閱讀普通教程一樣,按順序閱讀本書的每一章。本書基于難度和內容詳略等因素對各章的順序做了編排和優化,力求為讀者帶來流暢的閱讀體驗。
配套視頻
針對書中有難度的知識點,本書還配套提供了視頻講解“Redis應用十講”,讀者可以直接掃描第一次出現相關主題的對應章的二維碼免費觀看。視頻講解的具體內容如下:
● 第1講“使用緩存提高訪問數據的速度”(對應第1章和第2章);
● 第2講“使用鎖保證重要資源的獨占使用權”(對應第3章和第4章);
● 第3講“使用先進先出隊列解決搶購和秒殺問題”(對應第26章和第27章);
● 第4講“使用簡單計數器和唯一計數器進行計數”(對應第6章和第7章);
● 第5講“使用排行榜對元素進行有序排列”(對應第22章);
● 第6講“使用自動補全為用戶提供輸入建議”(對應第16章);
● 第7講“構建類似Stack Overflow等網站的投票系統”(對應第21章、第7章和第9章);
● 第8講“使用分頁和時間線排列并管理大量元素”(對應第23章和第24章);
● 第9講“使用社交關系程序存儲用戶間的社交關系”(對應第18章);
● 第10講“使用地理位置程序記錄用戶的位置信息”(對應第25章)。
目標讀者
閱讀本書需要讀者對Redis有一定的了解,并且熟悉Redis各個命令的基本語法。
因為本書關注的是如何使用Redis命令實現各種應用,而不是詳細介紹某個或某些Redis命令的具體語法,所以剛開始學習Redis或者對Redis命令的語法并不熟悉的讀者需要在閱讀本書的過程中自行查找并學習書中提到的命令。相信這種邊做邊學、學以致用的方式將有助于讀者快速、有效地掌握Redis命令及其用法,從而成為熟練的Redis使用者。
書中所有實例程序均使用Python編程語言編寫,程序的風格以簡單易懂為第一要務,基本上沒有用到Python的高級特性。任何學過Python編程語言的讀者都應該能很好地理解書中的代碼,而沒有學過Python編程語言的讀者可以把這些樸素的代碼看作偽代碼,以此來理解程序想要完成的工作。
本書適合任何想要學習Redis應用構建方法和使用Redis解決實際問題的人,也可以作為Redis學習者在具備一定基礎知識之后的進階應用教程。
代碼風格說明
正如前文所言,本書展示的程序以簡單易懂為第一要務,為了達到這個目的,本書有時候可能會故意把代碼寫得詳細一些。
例如,為了清晰地展現判斷語句的判斷條件,本書將采用下面這樣的具體寫法:
if bool_value is True: pass
而不是采用下面的簡單寫法:
if bool_value: pass
又如,為了讓沒學過Python語言的人也能看懂程序的打開文件操作,本書將采用以下語句:
f = open(file, mode) # do something f.close()
而不是Python程序員更常用的with
語句:
with open(file, mode) as f: # do something
基于上述原因,本書的部分代碼對熟練的Python使用者來說可能會稍顯啰唆,但這是事出有因的,希望讀者可以理解。
代碼注釋
本書在展示Python示例代碼的時候,將使用標準的#
符號來標識Python代碼中的注釋:
>>> from random import random # 導入隨機數生成函數 >>>
另外,由于本書在展示Redis操作時需要用到Redis官方客戶端redis-cli,但該客戶端并不支持注釋語法,因此本書將采用自選的--
符號作為注釋:
redis> PING -- 向服務器發送一個請求 PONG
因為redis-cli實際上并不支持這種注釋語法,所以讀者在把本書展示的Redis操作代碼復制到redis-cli中運行時,請不要復制代碼中的注釋內容,以免代碼在運行時出錯。
關注核心原理而非細枝末節
本書聚焦實戰,書中展示的各種實例無一不來源于實際的編程問題,但考慮到現實中的程序往往包含大量無關的邏輯和細節,在書中事無巨細地展示它們除模糊焦點和浪費篇幅之外,不會有其他任何好處。
舉個例子,一個現實中的消息隊列程序可能由數千行代碼和數十個API組成,但如果僅在講消息隊列的第14章中就包含如此大量的代碼和API,那么本書的篇幅將膨脹至讓人無法接受的程度。
為了解決這個問題,本書采取了算法書介紹算法時的策略:不羅列和介紹每種應用可能包含的全部API,而是精挑細選出一組關鍵、核心的API,然后用簡潔精練的代碼在書中實現它們,配上合理的描述和解釋,力求讓讀者盡可能地理解這些核心API的實現原理。一旦讀者弄懂了這些核心API,就可以根據自己的需求移植這些應用,并在此基礎上舉一反三,為應用擴展出自己想要的任何API。
軟件版本信息
本書展示的所有Redis代碼均在Redis 7.4版本中測試,Python代碼均在Python 3.12版本中測試,使用的redis-py客戶端版本為5.1.0b7,這是截至本書寫作完成時這幾種軟件的最新版本。
要運行本書展示的代碼和程序,讀者需要在計算機上安裝以上3種軟件,并確保它們的版本不低于上面提到的版本。具體的軟件安裝方法請參考它們各自的官方網站。
獲取程序源碼
本書展示的所有程序的源碼都可以在異步社區(www.epubit.com)通過搜索本書書名找到下載鏈接,讀者也可以通過執行以下命令克隆程序源碼:
git clone git@github.com:huangzworks/rediscookbook.git
致謝
感謝人民郵電出版社楊海玲編輯在本書創作過程中的專業指導,感謝我的家人的悉心關照,還要感謝關注本書的讀者對本書的期待,本書是在眾多人的關心和支持下才得以完成的。
黃健宏
2024年9月于廣東清遠
- Greenplum:從大數據戰略到實現
- Test-Driven Development with Mockito
- 大數據時代下的智能轉型進程精選(套裝共10冊)
- Mockito Cookbook
- 數亦有道:Python數據科學指南
- Starling Game Development Essentials
- 大數據精準挖掘
- Python數據分析從小白到專家
- 大數據測試技術:數據采集、分析與測試實踐(在線實驗+在線自測)
- 數據中臺實戰:手把手教你搭建數據中臺
- 數據會說話:活用數據表達、說服與決策
- C# 7 and .NET Core 2.0 High Performance
- Configuration Management with Chef-Solo
- 高效使用Redis:一書學透數據存儲與高可用集群
- Applying Math with Python