背景
眾所周知,redis是純內存的操作。所以速度極快。然而內存的大小是有限的。
如:mysql中有2000w的數據,redis中只存20w的數據,那么如何保證redis中的數據都是熱點數據呢?
答案:redis內存數據集達到一定大小的時候,就會實行數據淘汰策略,內存的淘汰機制的初衷是為了更好地使用內存
寫在淘汰策略之前:reids 過期策略
我們在設置一個key的時候,一般會給這個key設置一個過期時間(expire time),如:key的過期時間1小時,那么一小時到了,這個key是如何被刪除的呢?
答案就是:定期刪除+惰性刪除
定期刪除
指的是redis默認是每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。注意,這里可不是每隔100ms就遍歷所有的設置過期時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的。定期刪除可能會導致很多過期key到了時間並沒有被刪除掉,這時候就需要惰性刪除了。
惰性刪除
在獲取某個key的時候,redis會檢查一下 ,這個key如果設置了過期時間那么是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。
兩種結合使用,就能夠保證:一個key如果過期了,肯定會被刪除了
但是,如果定期刪除漏掉了很多過期key,然后也沒及時去做查詢,也就沒走惰性刪除,此時就可能會有大量過期key堆積在內存里,導致redis內存塊耗盡
怎么辦?
答案是:走內存淘汰機制。
redis的淘汰策略:默認是 noeviction
noeviction:當內存使用達到閥值的時候,所有引起申請內存的命令會報錯;
allkeys-lru:嘗試回收,最近未使用或者使用比較少的鍵。(范圍是:所有的鍵)
volatile-lru:嘗試回收,最近未使用或者使用比較少的鍵。(范圍是:設置了過期時間的鍵)
allkeys-random:隨機移除某個key。(范圍是:所有的鍵)
volatile-random:隨機移除某個key。(范圍是:設置了過期時間的鍵)
volatile-ttl:回收過期時間較短的key。(范圍是:設置了過期時間的鍵)
————————————————
版權聲明:本文為CSDN博主「冰_先森」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/goodmorning_java/java/article/details/97244415