redis server有很多個數(shù)據(jù)庫空間

如下如所示

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

dbnum表示的是數(shù)據(jù)庫的數(shù)量,db指針指向的是一個redisdb數(shù)組,默認(rèn)都是16個,每一個都是一個redisdb結(jié)構(gòu)的數(shù)據(jù)庫,redis client結(jié)構(gòu)里面會有一個redisdb的指針,指向的就是其中的一個數(shù)據(jù)庫

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

每一個redisdb里面都有一個字典,指向的就是kv結(jié)構(gòu)。

 

 

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

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

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

上面4中設(shè)置生存和過期的時間,其實最后都是在不斷的轉(zhuǎn)換,調(diào)用的PEXPIREAT

  

 

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

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

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

 

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

 

過期鍵的刪除策略

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

節(jié)省內(nèi)存,占用cpu

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

不會對cpu是、產(chǎn)生什么影響,但是大大的浪費了內(nèi)存,對于一些非常依賴內(nèi)存的server來說,這是不友好的。如果某些鍵一直不會被訪問,他會一直存在數(shù)據(jù)庫里面,這其實是一種內(nèi)存泄漏

(3)定期刪除:每隔一段時間,都會檢查一部分?jǐn)?shù)據(jù)庫,如果過期就刪除

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

 

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

 

 

AOF,RDB復(fù)制對過期鍵的處理

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

 

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

 

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

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

 萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

http://www.cnblogs.com/13224ACMer/p/7075383.html