內存淘汰策略
當 Redis 節(jié)點分配的內存使用到達最大值以后会涎,為了繼續(xù)提供服務宏多,Redis 會啟動內存淘汰策略,在Redis4.0之前主要是以下六種淘汰策略:
- noeviction:不淘汰任何數(shù)據揭芍,當內存不足時胳搞,執(zhí)行緩存新增操作會報錯,這種策略下可以保證數(shù)據不丟失称杨,它也是 Redis 默認的內存淘汰策略肌毅。
- allkeys-lru:淘汰整個鍵值中最久未使用的鍵值,這也就是我們常說的LRU算法姑原。
- allkeys-random:隨機淘汰任意鍵值悬而。
- volatile-lru:淘汰所有設置了過期時間的鍵值中最久未使用的鍵值。
- volatile-random:隨機淘汰設置了過期時間的任意鍵值锭汛。
- volatile-ttl:優(yōu)先淘汰設置了過期時間中更早過期的鍵值笨奠。
而在Redis4.0版本中又新增了2種淘汰策略:
- allkeys-lfu袭蝗,淘汰整個鍵值中最少使用的鍵值,這也就是我們常說的LRU算法般婆。
- volatile-lfu到腥,淘汰所有設置了過期時間的鍵值中最少使用的鍵值。
過期策略
定期刪除
redis 會將每個設置了過期時間的 key 放入到一個獨立的字典中蔚袍,以后會定期遍歷這個字典來刪除到期的 key乡范。
Redis 默認會每秒進行十次過期掃描(100ms一次),過期掃描不會遍歷過期字典中所有的 key啤咽,而是采用了一種簡單的貪心策略晋辆。
1.從過期字典中隨機 20 個 key
2.刪除這 20 個 key 中已經過期的 key
3.如果過期的 key 比率超過 1/4,那就重復步驟 1
惰性刪除
所謂惰性策略就是在客戶端訪問這個key的時候宇整,redis對key的過期時間進行檢查瓶佳,如果過期了就立即刪除,不會給你返回任何東西鳞青。
定期刪除可能會導致很多過期key到了時間并沒有被刪除掉霸饲。所以就有了惰性刪除。假如你的過期 key盼玄,靠定期刪除沒有被刪除掉贴彼,還停留在內存里,除非你的系統(tǒng)去查一下那個 key埃儿,才會被redis給刪除掉器仗。這就是所謂的惰性刪除,即當你主動去查過期的key時,如果發(fā)現(xiàn)key過期了,就立即進行刪除,不返回任何東西童番。