Redis緩存鍵的過期策略

redis是目前很流行的key-value形式的、基於內存的NoSQL數據庫,相比於memocache有更加豐富的數據類型,能適應更多的業務場景,因此得到了廣泛的應用。本文主要關注的是redis緩存鍵的過期策略,更多關於redis的介紹詳見redis官網

redis有四個不同的命令用於設置鍵的過期時間:

命令名 功能
EXPIRE <key> <ttl> 將鍵的生存時間設置爲ttl秒
PEXPIRE <key> <ttl> 將鍵的生存時間設置爲ttl毫秒
EXPIREAT <key> <timestamp> 將鍵的生存時間設置爲timestamp指定的秒數時間戳
PEXPIREAT <key> <ttl> 將鍵的生存時間設置爲timestamp指定的毫秒數時間戳

前三個命令最終都會轉換成PEXPIREAT命令來實現,然後將鍵的過期時間以毫秒精度的UNIX時間戳保存到expires字典中。
那麼過期的鍵何時會被刪除呢?
redis中有三種策略:

1、定時刪除,設置鍵的過期時間的同時設置一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
2、惰性刪除,放任鍵測過期不管,但每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵,如果沒有過期就返回該鍵。
3、定期刪除,每隔一段時間,程序對數據進行一次檢查,刪除裏面的過期鍵,至於要刪除多少過期鍵,以及檢查多少個數據庫,則由算法決定。

定時刪除對內存是友好的,在特定的時間會將鍵刪除,但對cpu並不友好,因爲定時任務要花費大量時間去查找事件表。與之相反,惰性刪除對cpu是友好的,但對內存並不友好,因爲如果這個鍵沒有被訪問到的話,它將永遠不會被刪除。以上兩種刪除策略單獨使用時都有明顯缺陷,因此有了整合兩種策略的第三種策略:定期刪除。定期刪除策略會在規定的時間內,分多次遍歷服務器中的數據庫,從數據庫的expires字典中隨機檢查一部分鍵的過期時間,並刪除其中的過期鍵。


參考文檔:https://redis.io/commands/expire

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章