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的。你也就無法做相應的事件處理。
