什麼是redis,為啥用快取?
redis是用記憶體當快取的。redis主要是基於記憶體來進行高效能、高併發的讀寫操作的。
記憶體是有限的,比如redis就只能用10個g,你一直往裡面寫資料,一直寫一直寫最後10個g都用的差不多了,你繼續寫會發生什麼?當然會乾掉一些的資料了就保留10個g的資料。
那redis會乾掉哪些資料?保留哪些資料呢?當然是乾掉不常用的資料,保留常用的資料了。
所以說,這是快取的乙個最基本的概念:資料是會過期的。要麼是你自己設定個過期時間,要麼是redis自己給乾掉。
如果redis使用不當,把生產資料存到裡面,又沒有去持久化到mysql,那就會有丟失的可能。
如果你給key設定好了乙個過期時間,到一定的時間再去查這個key就沒有了,你知道redis是怎麼給你弄成過期的嗎?什麼時候刪除掉?
如果你不知道,在實際的使用過程中你就可能會發現這麼乙個問題:為啥好多資料明明應該過期了,結果發現redis記憶體占用還是很高?那是因為你不知道redis是怎麼刪除那些過期key的。
舉例,redis 記憶體一共是10個g,你現在往裡面寫了5個g的資料,然後你對這些資料全都設定了10分鐘之後過期,結果10分鐘之後,你再來檢視看,redis的記憶體使用率怎麼還是50%呢?5個g的資料都過期了,我從redis里查,是查不到了,結果過期的資料為啥還占用著redis的記憶體呢。
(1)設定過期時間
set key value 過期時間(1小時)
表示set進去的key,1小時之後就沒了,就失效了。
我們set key的時候,都可以給乙個expire time,就是過期時間,指定這個key比如說只能存活1個小時?10分鐘?我們自己可以指定快取到期就失效。
如果假設你設定一批key只能存活1個小時,那麼接下來1小時後,redis是怎麼對這批key進行刪除的?
答案是:定期刪除+惰性刪除
定期刪除,指的是redis預設是每隔100ms就隨機抽取
一些設定了過期時間的key,檢查其是否過期,如果過期就刪除。
為什麼是隨機抽取?
假設redis裡放了10萬個key,都設定了過期時間,你每隔幾百毫秒,就檢查10萬個key,那redis基本上就死了,因為這樣cpu負載會很高的,全都消耗在你的檢查過期key上了。
所以實際上redis是每隔100ms隨機抽取
一些key來檢查和刪除的。
隨機抽取仍會導致很多過期key到了時間並沒有被刪除掉,那咋整呢?所以redis還有另乙個策略就是惰性刪除
。
惰性刪除,指在你獲取某個key的時候,redis會檢查一下 ,這個key是否設定了過期時間並且是否過期?如果過期了此時就會刪除,不會給你返回任何東西。
所以並不是key到時間就被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下。
通過上述兩種手段,過期的key就會被乾掉。
所有,剛剛的問題,過期key靠定期刪除沒有被刪除掉,還停留在記憶體裡,除非去查一下那個key,才會被redis給刪除掉,短時間內你的redis記憶體佔用率所以還是會下不來。
別擔心redis還有方案:記憶體淘汰機制。
(2)記憶體淘汰策略
如果redis的記憶體占用過多的時候,此時會進行記憶體淘汰,redis提供如下豐富的可選策略:
1)noeviction:
當記憶體不足以容納新寫入資料時,新寫入操作會報錯。
(這個一般沒人用吧,實在是太噁心了)
2)allkeys-lru:
當記憶體不足以容納新寫入資料時,在所有鍵空間中,移除最近最少使用的key
(這個是最常用的)
3)allkeys-random:
當記憶體不足以容納新寫入資料時,在所有鍵空間中,隨機移除某個key。
(這個一般沒人用吧,為啥要隨機,把我重要的key乾掉了咋整,肯定是把最近最少使用的乾掉)
4)volatile-lru:
當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。
(這個一般不太合適)
5)volatile-random:
當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個key。
6)volatile-ttl:
當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除。
例如:redis 裡有10個key,現在記憶體已經滿了,設定的淘汰策略是allkeys-lru
,此時redis需要刪除掉一些key來保證你可以繼續寫入。在這10個key中,其中1個key,最近1分鐘被查詢了100次,1個key,最近10分鐘被查詢了50次,1個key,最近1個小時被查詢了1次。肯定那些最近最少使用的被乾掉了。
redis過期策略
1 noeviction 一旦記憶體滿則返回錯誤 2 allkeys lru 對所有的key進行lru 3 volatile lru 只對設定了過期的key進行lru 預設的方式 4 allkeys random 隨機剔除乙個key 5 volatile random 對設定過期的key進行隨機剔除...
Redis過期策略
1,設定過期時間 expire key time 單位為秒 setex string key,int seconds,string value 字串獨有的方式 注意 過期key的判定 檢查給定key是否存在於過期字典,如果存在,那麼取得key的過期時間。檢查當前unix時間戳是否大於key的過期時間...
Redis 過期策略
redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 20 個 key 中已經過期的 key 如果過期的 key 比率超過 1 4,那就重複步驟 1 同時,為了保證過期掃瞄不會出現迴圈過度,導致執行...