定期刪除
redis 會將每個設(shè)置了過期時間的 key 放入到一個獨立的字典中蛮粮,以后會定期遍歷這個字典來刪除到期的 key旷余。
定期刪除策略
Redis 默認會每秒進行十次過期掃描(100ms一次),過期掃描不會遍歷過期字典中所有的 key,而是采用了一種簡單的貪心策略室抽。
從過期字典中隨機 20 個 key;
刪除這 20 個 key 中已經(jīng)過期的 key厨姚;
如果過期的 key 比率超過 1/4兢榨,那就重復(fù)步驟 1;
惰性刪除
除了定期遍歷之外室奏,它還會使用惰性策略來刪除過期的 key火焰,所謂惰性策略就是在客戶端訪問這個 key 的時候,redis 對 key 的過期時間進行檢查胧沫,如果過期了就立即刪除昌简,不會給你返回任何東西。
定期刪除是集中處理绒怨,惰性刪除是零散處理纯赎。
為什么要采用定期刪除+惰性刪除2種策略呢?
如果過期就刪除南蹂。假設(shè)redis里放了10萬個key犬金,都設(shè)置了過期時間,你每隔幾百毫秒,就檢查10萬個key晚顷,那redis基本上就死了峰伙,cpu負載會很高的,消耗在你的檢查過期key上了
但是問題是该默,定期刪除可能會導(dǎo)致很多過期key到了時間并沒有被刪除掉瞳氓,那咋整呢?所以就是惰性刪除了栓袖。這就是說顿膨,在你獲取某個key的時候,redis會檢查一下 叽赊,這個key如果設(shè)置了過期時間那么是否過期了恋沃?如果過期了此時就會刪除,不會給你返回任何東西必指。
并不是key到時間就被刪除掉囊咏,而是你查詢這個key的時候,redis再懶惰的檢查一下
通過上述兩種手段結(jié)合起來塔橡,保證過期的key一定會被干掉梅割。
所以說用了上述2種策略后,下面這種現(xiàn)象就不難解釋了:數(shù)據(jù)明明都過期了葛家,但是還占有著內(nèi)存户辞。