redis 會將每個設置了過期時間的 key 放入到壹個獨立的字典中,以後會定期遍歷這個字典來刪除到期的 key。
定期刪除策略
Redis 默認會每秒進行十次過期掃描(100ms壹次),過期掃描不會遍歷過期字典中所有的 key,而是采用了壹種簡單的貪心策略。
從過期字典中隨機 20 個 key;
刪除這 20 個 key 中已經過期的 key;
如果過期的 key 比率超過 1/4,那就重復步驟 1;
惰性刪除
除了定期遍歷之外,它還會使用惰性策略來刪除過期的 key,所謂惰性策略就是在客戶端訪問這個 key 的時候,redis 對 key 的過期時間進行檢查,如果過期了就立即刪除,不會給妳返回任何東西。
定期刪除是集中處理,惰性刪除是零散處理。
為什麽要采用定期刪除+惰性刪除2種策略呢?
如果過期就刪除。假設redis裏放了10萬個key,都設置了過期時間,妳每隔幾百毫秒,就檢查10萬個key,那redis基本上就死了,cpu負載會很高的,消耗在妳的檢查過期key上了
但是問題是,定期刪除可能會導致很多過期key到了時間並沒有被刪除掉,那咋整呢?所以就是惰性刪除了。這就是說,在妳獲取某個key的時候,redis會檢查壹下 ,這個key如果設置了過期時間那麽是否過期了?如果過期了此時就會刪除,不會給妳返回任何東西。
並不是key到時間就被刪除掉,而是妳查詢這個key的時候,redis再懶惰的檢查壹下
通過上述兩種手段結合起來,保證過期的key壹定會被幹掉。
所以說用了上述2種策略後,下面這種現象就不難解釋了: 數據明明都過期了,但是還占有著內存。
原文地址:? /s/FyYhLS3X7LDe0PLxooz_cQ