Redis過期策略

使用Redis時,一般會設置一個過期時間,那麼過期時間這個功能是怎麼實現的呢?

三種過期策略:

1,定時刪除

在設置key的過期時間的同時,爲該key設置一個定時器,讓定時器在key的過期時間到來的時候,對其進行刪除,這種設置的優點是可以保證內存儘快釋放,缺點是,當過期key比較多時,刪除這些key會佔用許多的CPU時間,在CPU時間緊張的時候,CPU不能把分出CPU時間來做最必要的事,此外需要花費時間刪除key,並且定時器創建也需要一定的耗時,同時有許多定時器產生,對性能影響嚴重。

2,懶漢式刪除

過期的時候不刪除。每次通過key獲取值的時候檢查是否過期,若過期。則刪除。這種策略的優點是隻發生在取值的時候,而且只刪除當前key,對CPU佔用時間少,而且此時的key是不可不刪除的。缺點就是大量的key在超出過期時間後,並且很久一段時間內沒有被獲取,那麼久可能讓許多垃圾佔用了內存。

3,定期刪除

每隔一段時間執行一次刪除過期key的操作,通過限制刪除的時長和頻率,來減少刪除操作對CPU時間的佔用,然後處理“定時刪除”的缺點,缺點是在內存友好方面沒有定時刪除友好,但是優於懶漢式,CPU時間友好方面,不如懶漢式,但是優於定時。

運用定期刪除的難點在於設置合適的執行時長和執行頻率,每次執行時間太長或者太長都是一種壓力,並且每次進行刪除之後,需要記錄遍歷循環到哪個標誌位,以便下個定期時間來臨時,從上個位置開始循環遍歷。

Redis採用的過期策略

懶漢式+定期刪除。

懶漢式:

在進行get和setnx的時候,先檢查key是否火氣,若過期,則刪除。否則繼續執行接下來的步驟。

定期:

對執行個數個庫的每一個庫隨機刪除一個刪除小於等於指定個數個過期key,遍歷每一個數據庫(Redis.conf配置的database的大小),檢查當前庫中的指定個數的key,如果當前庫沒有一個key設置了過期時間,執行下一個庫的遍歷,隨機獲取當前一個設置過期時間的key,檢查key是否過期,如果過期,刪除key。判斷定期刪除是否達到指定時長,達到則退出定期刪除。

對於定期刪除,有一個current_db來記錄下一個要遍歷的庫,假設有16個庫,一次定期刪除遍歷是個,那麼此時current_db就是11,下一次就是從第11個庫開始遍歷。如果等於current_db-1則之後遍歷從0開始。

 

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