Redis有4個命令可以設置鍵的過期時間:
1. expire <key> <ttl> 設置key的生存時間爲ttl秒;
2. pexpire <key> <ttk> 設置key的生存時間爲ttl毫秒;
3. expireat <key> <ts> 設置key的過期時間爲ts的秒數時間戳;
4. pexpireat <key> <ts> 設置key的過期時間爲ts的毫秒數時間戳;
實際上 expire, pexpire, expireat 3個命令都是使用pexpireat實現的,只需要轉換時間單位就行了。
redisDb結構中,有一個expires字典保存了所有key的過期時間,這個字典稱之爲過期字典。
typeof struct redisDb {
//...
dict *expires;
//...
} redisDb;
當一個key被設爲過期後,redisDb中鍵空間字典和過期字典中的鍵重複,並不會出現重複對象,2個key指向的都是同一個對象。
key過期刪除策略:
1.定時刪除:設置過期鍵的時候,創意一個定時器;
2.惰性刪除:放任過期鍵不管,每次訪問時,判斷是否過期,如過期則刪除;
3.定期刪除:每隔一段時間,redis會掃描過期鍵,發現過期則刪除;
Redis實際使用的是惰性刪除和定期刪除2種配合使用。
定期刪除函數執行步驟:
1.從一定量的數據庫中去除一定數量的隨機鍵檢查,刪除其中的過期鍵;
2.全局變量current_db會記錄當前函數檢查的進度,並在下一次調用時,接着上一次的進度處理。
3.隨着函數不斷被執行,所有過期鍵都會被檢查到,這時將current_db變量重置爲0,再開始新一輪的檢查。