一溯壶、Redis的過期策略
Redis在設(shè)置緩存數(shù)據(jù)時指定了過期時間誓酒,到了過期時間數(shù)據(jù)就失效了云头,那Redis是怎么處理這些失效的數(shù)據(jù)的呢再榄?這就用到了Redis的過期策略——"定期刪除+惰性刪除"?感混。
1旱易、定期刪除
定期刪除是指Redis默認(rèn)每隔?100ms?就?隨機(jī)抽取?一些設(shè)置了過期時間的key岖瑰,檢測這些key是否過期狮杨,如果過期了就將其刪除南誊。
※ 100ms怎么來的身诺?
在Redis的配置文件redis.conf中有一個屬性"hz",默認(rèn)為10抄囚,表示1s執(zhí)行10次定期刪除霉赡,即每隔100ms執(zhí)行一次,可以修改這個配置值幔托。
※?隨機(jī)抽取一些檢測穴亏,一些是多少?
同樣是由redis.conf文件中的maxmemory-samples屬性決定的重挑,默認(rèn)為5嗓化。
※?為什么是隨機(jī)抽取部分檢測,而不是全部谬哀?
因為如果Redis里面有大量key都設(shè)置了過期時間刺覆,全部都去檢測一遍的話CPU負(fù)載就會很高,會浪費大量的時間在檢測上面史煎,甚至直接導(dǎo)致redis掛掉谦屑。所有只會抽取一部分而不會全部檢查驳糯。
正因為定期刪除只是隨機(jī)抽取部分key來檢測,這樣的話就會出現(xiàn)大量已經(jīng)過期的key并沒有被刪除氢橙,這就是為什么有時候大量的key明明已經(jīng)過了失效時間酝枢,但是redis的內(nèi)存還是被大量占用的原因?,為了解決這個問題悍手,Redis又引入了“惰性刪除策略”帘睦。
2、惰性刪除
惰性刪除不是去主動刪除坦康,而是在你要獲取某個key 的時候竣付,redis會先去檢測一下這個key是否已經(jīng)過期,如果沒有過期則返回給你滞欠,如果已經(jīng)過期了卑笨,那么redis會刪除這個key,不會返回給你仑撞。
"定期刪除+惰性刪除"就能保證過期的key最終一定會被刪掉 ,但是只能保證最終一定會被刪除妖滔,要是定期刪除遺漏的大量過期key隧哮,我們在很長的一段時間內(nèi)也沒有再訪問這些key,那么這些過期key不就一直會存在于內(nèi)存中嗎座舍?不就會一直占著我們的內(nèi)存嗎沮翔?這樣不還是會導(dǎo)致redis內(nèi)存耗盡嗎?由于存在這樣的問題曲秉,所以redis又引入了“內(nèi)存淘汰機(jī)制”來解決采蚀。