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字典中隨機檢查一部分鍵的過期時間,並刪除其中的過期鍵。