1、場景應用redis
問題:好比你redis只能存5G數據,但是你寫了10G,那會刪5G的數據。怎麼刪的,這個問題思考過麼?還有,你的數據已經設置了過時時間,可是時間到了,內存佔用率仍是比較高,有思考過緣由麼?緩存
回答:redis採用的是按期刪除+惰性刪除策略。過時策略:按期刪除+惰性刪除bash
2、什麼是按期刪除,什麼是惰性刪除併發
按期刪除:redis默認每隔100ms就隨機抽取一些設置了過時時間的key,檢查其是否過時,若是有過時就刪除。注意這裏是隨機抽取的。爲何要隨機呢?你想想假如 redis 存了幾十萬個 key ,每隔100ms就遍歷全部的設置過時時間的 key 的話,就會給 CPU 帶來很大的負載。dom
惰性刪除:按期刪除可能致使不少過時的 key 到了時間並無被刪除掉。這時就要使用到惰性刪除。在你獲取某個key的時候,redis會檢查一下,這個key若是設置了過時時間而且過時了,是的話就刪除。ui
3、爲何不用定時刪除策略?blog
定時刪除,用一個定時器來負責監視key,過時則自動刪除。雖然內存及時釋放,可是十分消耗CPU資源。在大併發請求下,CPU要將時間應用在處理請求上,而不是刪除key上,所以沒有采用這一策略。內存
4、按期刪除+惰性刪除是如何工做的呢?資源
按期刪除,redis默認每隔100ms就檢查是否有過時的key,若是有過時key則刪除。須要說明的是,redis不是每一個100ms將全部的key檢查一次,而是隨機抽取進行檢查(若是每隔100ms,所有key進行檢查,redis豈不是卡死)。所以,若是隻採用按期刪除策略,會致使不少key到時間沒有刪除。因而,惰性刪除派上用場。也就是說在你獲取某個key的時候,redis會檢查一下,這個key若是設置了過時時間那麼是否過時了?若是過時了此時就會刪除。it
5、按期刪除+惰性刪除存在的問題:
若是按期刪除沒刪除key,而後你也沒即時去請求key,也就是說惰性刪除也沒生效。這時,若是大量過時的key堆積在內存中,redis的內存會愈來愈高,致使redis的內存塊耗盡。那麼就應該採用內存淘汰機制。
1、內存數據淘汰策略的配置:在redis.conf中有一行配置:
# maxmemory-policy volatile-lru
2、配置解釋
一、noeviction:當內存不足以容納新寫入數據時,不進行移除,新寫入操做會報錯。應該沒人用吧。
二、allkeys-lru:當內存不足以容納新寫入數據時,在全部的鍵空間中,移除最近最少使用的key。推薦使用,目前項目在用這種。
三、allkeys-random:當內存不足以容納新寫入數據時,在全部的鍵空間中,隨機移除某個key。應該也沒人用吧,你不刪最少使用Key,去隨機刪。
四、volatile-lru:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除最近最少使用的key。這種狀況通常是把redis既當緩存,又作持久化存儲的時候才用。不推薦。
五、volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個key。依然不推薦。
六、volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除即將過時的key進行淘汰,即更早過時時間的key優先移除。不推薦。
ps:若是沒有設置 expire 的key, 不知足先決條件(prerequisites); 那麼 volatile-lru, volatile-random 和 volatile-ttl 策略的行爲, 和 noeviction(不刪除) 基本上一致。