redis key 過期時間


redis key 過期時間:

EXPIRE key 100

設置了過期時間,100秒后,key將自動被刪除。

過期時間刪除的方法有三種:

1、刪除這個key,使用del command

2、用set or getset 命令會將key的expiration清空,事實上set和getset命令是替換了key對應的value,所以key的過期時間也就不復存在。所以,需要注意的是:incr,LPUSH,HSET命令是不會改變key的過期時間的。原來是多久,這三條命令執行完之后還是多久。

3、使用persist命令清楚key的過期時間。

rename命令是將keyA變為keyB,無論keyB是否已經存在,keyA的過期時間都會被keyB繼承過去。

 

刷新過期時間:

多次調用expire key 100 可以刷新key的過期時間。

返回值:

返回值:1代表過期時間被設置。

返回值:0代表key不存在或者timeout不能被設置。

 

redis如何清除過期keys:

redis有兩種方式清除過期keys:主動方式,和被動方式。

1、主動方式:當client訪問某一個key,redis會check key是否過期,如果已經過期,則被刪除。

2、被動方式:不是所有的key都能被client訪問。redis有一套默認的機制,redis每秒會進行10次以下動作:

a、隨機從keys中挑選100個key,這100key是關聯了過期時間的key。

b、刪除已經過期的key。

c、如果刪除的key超過25個,那么重復步驟a。

這是一個不是很嚴格的算法。不過可以基本保證過期的keys小於總數的25%。其實這是一種近似算法。隨機選數,檢查並刪除。隨機選key就保證了大致概率,結果只能是近似的。

這意味着:在任意時間點,那些占用內存並已經過期的keys的數量最多等於每秒寫入數量的四分之一。

 

key 過期如何解決主從節點同步以及AOF文件:

為了保證結果一致性,當key過期時,從節點會等待主節點的刪除命令,從節點不會自己刪除已經過期的key,主節點會進行集權控制,保證一致性。不過假如意外掉電,或者節點當機不知道會是什么情況。會不會導致主節點key已經刪除,而從節點沒有刪除的情況。官方網站也沒有一個明確的解釋。

 

expire的持久化:

redis key的過期時間很有意思:以unix的時間戳存儲。也就是說,在redis server不活動的情況下,key的過期時間仍然是有效的。這樣會帶來什么情況呢,比如數據庫文件RDB從一台2013年11月27日00:00:00的服務器上移動到2013年11月30日00:00:00的服務器上,重啟redis server,那么RDB中所有過期時間<=3天的keys都會被清除。

假如不想所有的keys都被清除的話,可以將服務器時間設置為過去的時間。

 

心得:

1、hmset、rpush、incr不會清除key的timeout。

2、hmset的fileds的key不能設置timeout。

3、我們只能通過ttl來查看 key的過期時間。

4、過期時間精准度不是特別的准。比如說,部分keys永遠不會被主動access,在被動清除模式中也不一定每次都能被random選中,那么就有可能清除時間會被延后。可能是幾毫秒。如果對於過期時間要求非常精准的情況下,需要慎重。

5、key被清除的時候目前是沒有notification的。你也就無法做相應的事件處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM