redis過期策略實現機制
阿新 • • 發佈:2018-11-19
參考: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
判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。