1. 程式人生 > >redis過期策略實現機制

redis過期策略實現機制

參考:https://www.cnblogs.com/xuliangxing/p/7151812.html

一、redis設定過期時間

    將某個key設定過期時間:expire key time(以秒為單位)

    原子方式,同時設定值和過期時間:setex(String key, int seconds, String value)

    注:如果沒有設定時間,那快取就是永不過期;如果設定了過期時間,之後又想讓快取永不過期,使用persist key
 

二、3種過期策略

    

策略 含義 優點 缺點
定時刪除 設定過期時間時,為key建立一個定時器,時間到時進行刪除 保證記憶體被儘快釋放

a.若過期的key數量較大時,因為每個key都會有個定時器,會比較佔cpu

b.大量定時器的建立比較耗時

懶漢式刪除 key過期了不自動刪除,等到獲取值的時候再去判斷是否過期,若過期了則刪除 不用額外建立刪除任務,很少佔用cpu 暫用記憶體,若大量key過期後沒有被用到(不去獲取值),可能導致記憶體洩漏
定期刪除 每隔一段時間執行一次過期key的刪除操作

通過限制刪除操作的時長和頻率,來減少cpu的佔用率;

cpu佔用優於定時刪除

記憶體佔用方面優於懶漢式 

cpu佔用方面劣於懶漢式

記憶體佔用方面劣於定時刪除

 三、redis採用的過期策略

懶漢式刪除+定期刪除

懶漢式刪除:
1.在進行get或setnx等操作時,先檢查key是否過期,
2.若過期,刪除key,然後執行相應操作;
3.若沒過期,直接執行相應操作


定期刪除流程(簡單而言,對指定個數個庫的每一個庫隨機刪除小於等於指定個數個過期key)


1.遍歷每個資料庫(就是redis.conf中配置的"database"數量,預設為16)
2.檢查當前庫中的指定個數個key(預設是每個庫檢查20個key,注意相當於該迴圈執行20次,迴圈體時下邊的描述)
   如果當前庫中沒有一個key設定了過期時間,直接執行下一個庫的遍歷
   隨機獲取一個設定了過期時間的key,檢查該key是否過期,如果過期,刪除key
   判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。