1. 程式人生 > >redis 數據庫

redis 數據庫

cnblogs 功能 expire 解決 多個數據庫 操作 save -1 保存

redis server有很多個數據庫空間

如下如所示

技術分享

dbnum表示的是數據庫的數量,db指針指向的是一個redisdb數組,默認都是16個,每一個都是一個redisdb結構的數據庫,redis client結構裏面會有一個redisdb的指針,指向的就是其中的一個數據庫

技術分享

每一個redisdb裏面都有一個字典,指向的就是kv結構。

過期時間和生存時間的問題,我們可以通過設置EXPIRE,PEXPIRE 設置時生存時間,精度分別為秒和毫秒

我們也可以通過EEXPIREAT和PEXPIREAT設置過期時間,精度類似

通過TTL和PTTL我們可以知道我們的key的剩余時間

上面4中設置生存和過期的時間,其實最後都是在不斷的轉換,調用的PEXPIREAT

redisdb中通過expire字典保存了過期時間,鍵是一個指針,指向redisdb中的鍵,值是一個longlong,表示的就是unix時間戳。

技術分享

上圖只是一個簡化,實際中dict和expires中相同的鍵只有一個,之間會通過指針指向。節約了內存空間

PERSIST表示的是移除,就是把過期時間刪除

過期鍵的刪除策略

(1)定時刪除:創建一個定時器,讓定時器在鍵的過期時間來的時候,立刻執行刪除操作

節省內存,占用cpu

(2)惰性刪除:放任不管,但是當每次操作的時候,都先檢查一下,是否過期了,如果過期了就刪除

不會對cpu是、產生什麽影響,但是大大的浪費了內存,對於一些非常依賴內存的server來說,這是不友好的。如果某些鍵一直不會被訪問,他會一直存在數據庫裏面,這其實是一種內存泄漏

(3)定期刪除:每隔一段時間,都會檢查一部分數據庫,如果過期就刪除

定期刪除其實看著可以解決上面兩個存在的問題,但是難點在於設置時長和頻率,如果設置的長,其實浪費cpu,如果設置的段,其實還會造成內存占用的問題

定期會有一個全局變量current_db表示遍歷到了那個數據庫,如果全部便利完了,會重置為0,

AOF,RDB復制對過期鍵的處理

執行SAVE和BGSAVE的時候,我們會生成一個新的RBD,如果鍵過期的話,不會保存到裏面

在啟動server的時候,如果server開啟了RDB功能,那麽在集群中,如果服務器以主服務器模式啟動的話,對於過期的不會載入數據庫,如果以從服務器模式運行的話,如果數據庫鍵過期的話, 會被載入到數據庫中

復制模式下過期鍵的處理,如果主服務器的鍵過期了,但是沒有指定del,那麽從服務器仍然存在,client範文主服務器的過期鍵沒有,但是訪問從服務器的過期鍵還是有的,只有主服務器刪除了,才會向所有從服務發一個del命令,所有的從服務器收到了這個命令後,才會刪除自己的過期鍵,這樣的話,就實現主從一致的問題

技術分享

技術分享

redis 數據庫