天天看點

《Redis 使用手冊》:一網打盡base36.pyshorty_url.py

今天想要自來水式地推薦一本去年的新書《Redis 使用手冊》。Redis 可算是現今記憶體資料庫的實施标準,擁有豐富的資料結構和強大的功能,适用于各種不同的開發場景。對于泛化的大資料研發工程師來說,Redis 是職業生涯中繞不過去的一道坎。這本書由超過十年經驗的 Redis 專家,擅長技術協作的黃健宏先生撰寫,至少有以下幾個特點,使得它非常适合大資料研發方向的新手。

内容詳盡,循序漸進

全書一共分為三個部分總二十章。第一章僅用八頁就介紹完安裝 redis 和 redis-py 等準備工作,毫不拖泥帶水混頁數。第二章到第十章針對 Redis 開箱即用的資料結構從基礎到複雜,從常用到專用一一列舉說明。第十一章到第十七章講解了 Redis 豐富的進階功能和自定義邏輯的能力。最後三章介紹了分布式的 Redis 叢集特性。

本書作為一本使用手冊,内容詳盡能夠保證其基本功能。即使讀者是熟悉 Redis 的工程師,本書中對于各個指令的含義介紹,選項列舉和複雜度分析都足以支撐本書作為案上的參考書。

循序漸進指的是本書從最基礎的字元串鍵值對開始講起,到常見的散列、清單和集合結構,一一介紹其接口,并結合圖形化的資料庫布局,直覺地給讀者相應資料結構的實作第一印象。

每次講解一個新的資料結構,作者總會從具體的實用例子引入,但例子又不超過一頁的長度。腦海中記住要解決的問題,從資料結構的鍵和内容布局出發,到具體内容的每個部分以及每種能想到的常見功能逐一展開讨論。整體給人一種作者對 Redis 的資料結構爛熟于心的感覺。這種接口的羅列常常是枯燥無味的,但本書卻有 man 手冊頁那種精簡中包含着核心設計思想的味道。

示例精良,邊學邊做

本書基本的示例形式是結合 redis-cli 和 redis-py 來展示的。每介紹一種資料結構,每介紹其中一簇接口就會給出一個業界常用的示例。例如實作短網址生成程式的執行個體中,作者首先通過圖文并茂的數百字文字介紹了短網址的問題背景,簡言之就是類似微網誌分享的三十六進制短網址到原網址的映射。緊接着,給出了使用 redis-py 的參考實作。

base36.py

def base10_to_base36(number):

alphabets = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"

result = ""

while number != :

number, i = divmod(number, 36)
result = (alphabets[i] + result)           

return result or alphabets[]

shorty_url.py

from base36 import base10_to_base36

ID_COUNTER = "ShortyUrl::id_counter"

URL_HASH = "ShortyUrl::url_hash"

class ShortyUrl:

def __init__(self, client):

self.client = client
           

def shorten(self, target_url):

"""..."""
new_id = self.client.incr(ID_COUNTER)
short_id = base10_to_base36(new_id)
self.client.hset(URL_HASH, short_id, target_url)
return short_id
           

def restore(self, short_id):

"""..."""
return self.client.hget(URL_HASH, short_id)           

這裡貼上示例主要是有一個示例簡短的直覺感受。原書中還包括每個方法的方法注釋以及關鍵行數的解釋,并且在示例之後有詳盡又不啰嗦的解釋。這跟某些粗制濫造的書籍動辄粘貼複制一大篇代碼,毫無上下文,貼完就開始自言自語的行文風格實在大相徑庭。

類似于這裡的短連接配接,還有其他示例中包括的文章存儲,ID 生成器,計數器,點贊功能等等,都是 Redis 近十年來在業界廣泛使用而且極為成功的案例。這些例子在面試中極有可能作為對求職者 Redis 的考察出現。此外,

手遊

書中的例子是自包含的,也就是說你可以很簡單的複現,修改,調試和觀察。這對于新手來說是非常重要的。隻有不停的折騰代碼,才能對代碼的邊界,各種條件下的行為有直覺的認識,而積累這些經驗正是代碼工匠的成長過程。

字型美觀,排版工整

這一點還蠻重要的,此前推薦的《資料結構》就有這個特點。這本《Redis 使用手冊》也類似,空格、留白和中英文字型都非常的舒适。内嵌的圖檔也由基本的淺紅加黑色主題構成,簡潔而清晰。章節、示例和代碼一眼就能看出不同的區塊。包括其中的提示和小知識以及最後的章節重點回顧,跟《Java 并發程式設計實踐》很有些相似,讀起來頗有種親切感。

總的來說,這本書濃縮了作者多年的經驗。同時,作者作為一名成熟的技術寫作家,在行文和排版上很有一套風格。開篇僅用八頁就介紹了準備工作,可以看出作者想把更多的内容留給具體的接口讨論和示例實驗上,實在與某些安裝一個東西一個章節的書籍形成鮮明對比。由于本文主要是推薦給大資料研發領域的新手,對于書中具體内容的介紹也點到即止。實際上在介紹進階功能的第二部分中,作者對自定義腳本、資料庫概念和流水線與事務做出了比較詳盡的探讨,應該說技術深度上也是有一定值得稱道之處。

不過,鑒于 Redis 叢集還是比較嶄新的功能,同步和容錯與效率的權衡取舍也是非常複雜的領域,Redis 本身在這方面經受的考驗和積累的經驗尚顯不足。本書在讨論相關内容的時候一共也隻用了三章,對一些分布式環境下的極端情況讨論略顯簡單。但這畢竟不是當下 Redis 的主要使用場景,作為補充并引導讀者了解相應功能乃至參與貢獻,也算是起到了引路的作用。