過期策略
一、場景應用
問題:比如你redis只能存5G資料,可是你寫了10G,那會刪5G的資料,怎么刪的,這個問題思考過么?還有,你的資料已經設定了過期時間,但是時間到了,記憶體占用率還是比較高,有思考過原因么?
回答:redis采用的是定期洗掉+惰性洗掉策略,過期策略:定期洗掉+惰性洗掉
二、什么是定期洗掉,什么是惰性洗掉
定期洗掉:redis默認每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果有過期就洗掉,注意這里是隨機抽取的,為什么要隨機呢?你想一想假如 redis 存了幾十萬個 key ,每隔100ms就遍歷所有的設定過期時間的 key 的話,就會給 CPU 帶來很大的負載,
惰性洗掉:定期洗掉可能導致很多過期的 key 到了時間并沒有被洗掉掉,這時就要使用到惰性洗掉,在你獲取某個key的時候,redis會檢查一下,這個key如果設定了過期時間并且過期了,是的話就洗掉,
三、為什么不用定時洗掉策略?
定時洗掉,用一個定時器來負責監視key,過期則自動洗掉,雖然記憶體及時釋放,但是十分消耗CPU資源,在大并發請求下,CPU要將時間應用在處理請求,而不是洗掉key,因此沒有采用這一策略,
四、定期洗掉+惰性洗掉是如何作業的呢?
定期洗掉,redis默認每個100ms檢查,是否有過期的key,有過期key則洗掉,需要說明的是,redis不是每個100ms將所有的key檢查一次,而是隨機抽取進行檢查(如果每隔100ms,全部key進行檢查,redis豈不是卡死),因此,如果只采用定期洗掉策略,會導致很多key到時間沒有洗掉,于是,惰性洗掉派上用場,也就是說在你獲取某個key的時候,redis會檢查一下,這個key如果設定了過期時間那么是否過期了?如果過期了此時就會洗掉,
五、定期洗掉+惰性洗掉存在的問題:
如果定期洗掉沒洗掉key,然后你也沒即時去請求key,也就是說惰性洗掉也沒生效,這時,如果大量過期的key堆積在記憶體中,redis的記憶體會越來越高,導致redis的記憶體塊耗盡,那么就應該采用記憶體淘汰機制,
記憶體淘汰機制
一、記憶體資料淘汰策略的配置:在redis.conf中有一行配置:
# maxmemory-policy volatile-lru
二、配置解釋
1、noeviction:當記憶體不足以容納新寫入資料時,不進行移除,新寫入操作會報錯,應該沒人用吧,
2、allkeys-lru:當記憶體不足以容納新寫入資料時,在所有的鍵空間中,移除最近最少使用的key,推薦使用,目前專案在用這種,
3、allkeys-random:當記憶體不足以容納新寫入資料時,在所有的鍵空間中,隨機移除某個key,應該也沒人用吧,你不刪最少使用Key,去隨機刪,
4、volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key,這種情況一般是把redis既當快取,又做持久化存盤的時候才用,不推薦,
5、volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個key,依然不推薦,
6、volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除即將過期的key進行淘汰,即更早過期時間的key優先移除,不推薦,
ps:如果沒有設定 expire 的key, 不滿足先決條件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不洗掉) 基本上一致,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/223906.html
標籤:其他
上一篇:MongoDB--安全認證
