《Redis設計與實現》學習筆記 單機資料庫

2021-06-29 04:49:17 字數 1075 閱讀 1409

乙個redis伺服器例項在單機執行時可以新增多個資料庫來儲存鍵值對,redis在實現中通過乙個redisdb結構體來描述資料庫,該結構體中有乙個字典型別的字段來儲存資料庫中所有的鍵值對,redisserver結構體來描述伺服器例項,該結構體中有乙個dbnum欄位來儲存資料庫數量,乙個redisdb陣列欄位來儲存伺服器中的所有資料庫。

struct redisserver;

typedef struct redisdb redisdb;

當客戶端呼叫set、rpush等命令之後會把命令中內容作為鍵值對新增到redisdb的dict字典欄位中,呼叫del等刪除操作時會刪除dict欄位中相應的資料。

客戶端可以通過呼叫select 《資料庫編號》 來切換資料庫。在伺服器內部,通過redisclient結構體儲存客戶端狀態,該結構體中有乙個db欄位來記錄目標資料庫,切換資料庫之後,redisclient結構體中的db屬性指向目標的資料庫結實例。

typedef struct redisclientredisclient;

在redisdb結構體中有乙個expires欄位,用來儲存資料庫中所有鍵的過期時間,這是乙個字典字段,鍵是乙個指向鍵物件的指標,值是乙個長整型數儲存過期時間(精確的unix毫秒時間戳),伺服器通過該字段來檢查鍵是否已過期。

此外可以通過ttl和pttl查詢鍵的剩餘生存時間,通過persist 移除鍵的過期時間。

當鍵過期時有三種刪除策略:

定時刪除,建立乙個定時器,在定時任務中刪除過期的鍵。這種策略節約記憶體但是耗cpu資源。

惰性刪除,不主動刪除過期鍵,每次訪問該鍵時如果該鍵過期刪除該鍵。這種策略對cpu消耗比較小,但是浪費記憶體,而且如果過期的鍵一致不被訪問的話有記憶體洩露的風險。

定期刪除,每隔一段時間,程式對資料庫做一次檢查,刪除裡面的過期鍵。但是不全部刪除,刪除多少由算法定,可以根據刪除鍵花費的時間或者一次刪除鍵的數量來控制。這種策略是1和2的折中,在記憶體和cpu上平衡,事實上很多效能調優的場景都是在記憶體和cpu之間犧牲哪乙個而糾結。

redis在實現時採用了2和3策略。

關於持久化和複製功能對過期鍵的處理:

Redis設計實現 學習筆記

最近在準備面試,問到redis相關知識,只能說個皮毛,說的既不深入也不全面,所以抓緊突擊一下,先學 redis設計與實現 選擇看書的原因是 書中全面深入,且能出書一定十分用心 搜部落格也找不到比書更全面的文章,且費時 直接看原始碼乙個是對c掌握不好,且易困,效率不高,所以跟著書同步學原始碼,是我認為...

《Redis設計與實現》學習筆記 Lua指令碼

redis從2.6開始支援lua指令碼,和事務的功能類似,可以通過lua指令碼原子的執行多個redis命令。redis提供了eval和evalsha命令執行lua指令碼。redis在伺服器內嵌了乙個lua壞境,並進行了一系列的修改,從而確保這個lua壞境可以滿足redis伺服器的需要,通過下列步驟建...

Linux設計與實現學習筆記

從第三章開始吧,前面都是overview的介紹 第三章 程序管理 程序的概念 處於執行期的程式 其他占用的資源 開啟的檔案,掛起的訊號.linux中線程是一種特殊的程序,區別於其他系統。fork exec exit 程序描述符及任務結構 每個程序對應乙個資料結構 task struct,稱為程序描述...