Redis設計與實現 學習筆記
寫在前面
這本書主要是講Redis底層的實現,總體上分為四部分:
- 資料結構與對象
- 單機資料庫的實現
- 多機資料庫的實現
- 獨立功能的實現
這個順序和作者自己學習的順序應該是一致的,但是感覺有一點不合理:在剛開始看的時候一直比較著急,因為是在對Redis整體上沒有概念的情況下看細節。
Redis設計與實現 第二版 高清PDF 下載
學習筆記
在Redis中鍵為字串、值為對象,底層處理用到的資料結構有:
- 動態字串:使用預分配和惰性釋放來減少記憶體操作次數
- 鏈表
- 字典:漸進式rehash防止卡住
- 跳躍表
- 整數集合:有序、不重複的整數集合,在必要的時候升級來節約記憶體
- 壓縮列表:連續記憶體儲存整數或位元組的列表,通過壓縮來節省記憶體
- 對象:在Redis中都是對象,實現基於上面的資料結構
由於Redis是用C編寫的,沒有記憶體回收機制,因此在對象系統中構建了一個引用計數實現記憶體回收器,通過該機制,程式可以通過跟蹤對象的引用計數資訊,在適當的時候自動釋放對象並進行記憶體回收。
有了這些基礎就可以開始看Redis作為一個伺服器是如何工作的:
+-------------+ | redisServer | +------+------+ | +-----------+ +------+------+ +-----------+|redisClient+-----+ redisDb +--+---+ dict |+-----------+ +-------------+ | +-----------+ | redisDb | | +-------------+ | +-----------+ | redisDb | +---+ expires | +-------------+ +-----------+
其中:
- dict:鍵空間
- expires:鍵的到期時間
還有另外一種做到期時間的方法是:對dict上的鍵做擴充,增加到期時間欄位。和Redis的做法相比可能有幾個缺點:浪費空間、遍曆時浪費時間、結構不清晰。到期鍵的刪除有三種策略:
- 定時刪除:在設定鍵的到期時間時建立Timer,當Timer運行時執行刪除操作
- 惰性刪除:在取值時判斷是否到期,如果到期則刪除
- 定期刪除:每隔一段時間對資料庫進行檢查掃描,刪除裡面到期的鍵
定時刪除顯然不靠譜,在Redis中同時使用了定期刪除和惰性刪除,當然在持久化程式中也需要考慮到期時間。
下面關於Redis的文章您也可能喜歡,不妨參考下:
Ubuntu 14.04下Redis安裝及簡單測試
Redis主從複製基本配置
Redis叢集明細文檔
Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis
Redis系列-安裝部署維護篇
CentOS 6.3安裝Redis
Redis安裝部署學習筆記
Redis設定檔redis.conf 詳解
Redis 的詳細介紹:請點這裡
Redis 的:請點這裡
本文永久更新連結地址: