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命令,重寫的時候也不重寫過期鍵;
主從同步的時候,主服務器會向所有的服務器發送刪除過期鍵的指令,從服務器只有在收到命令時才進行刪除,所以如果某個鍵過期,訪問從庫時可能還能拿到它的值。
數據庫發送通知功能的實現
該功能允許用戶訂閱某類或者某個或者全部的鍵操作的通知。