Redis 的設計與實現——之(六)Redis數據庫的實現與過期機制

Redis服務器的數據庫實現~

redisServer 在啓動的時候默認啓動16個數據庫,每個redisClient有自己連接的db,記錄在redisClient的db屬性裏,客戶端可以切換自己鏈接的db.

不難理解,其實每個db都有一個dic字典,保存key與value,我們的set也是將key與value設置到裏面,刪除、更新同理。在對鍵進行訪問時,會維護lru、更新dirty值等信息如下圖所示

其他的命令,如FLUSHDB命令,其實是刪除了dict中的內容。

過期機制

在db中有一個dict *expires 屬性用於保存key的過期時間,可以通過PEXPIREAT命令設置,PERSIST清除。

那麼過期鍵又應該如何清除呢?

       傳統的刪除策略一共有三種,定時清除(佔用cpu)、惰性清除(浪費內存)、定期刪除(這個期限不好確定)。而Redis採用了惰性刪除與定期刪除兩種策略。

惰性刪除:

              每次訪問前先看一下是不是過期了,過期的話就進行刪除,沒過期就什麼也不做。

定期刪除:

              Redis.c文件中有一個serverCron函數,每秒調用server.hz次,執行一些定時任務,其中databasesCron()中調用了定期刪除過期activeExpireCycle這個函數,按照一定策略每次對一些數據庫隨機檢查一些鍵進行操作

此外,在AOF,RDB中又如何處理過期鍵呢?

       生成RDB時會排除過期鍵,載入RDB文件時,如果是主庫載入則排除過期鍵,如果是從庫載入則都載入,但是主從同步的時候也會被刪除掉。、

              生成AOF的時候會對過期鍵生成一條DEL命令,重寫的時候也不重寫過期鍵;

              主從同步的時候,主服務器會向所有的服務器發送刪除過期鍵的指令,從服務器只有在收到命令時才進行刪除,所以如果某個鍵過期,訪問從庫時可能還能拿到它的值。

數據庫發送通知功能的實現

       該功能允許用戶訂閱某類或者某個或者全部的鍵操作的通知。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章