redis可以為快取資料的key設定expire time也就是過期時間,當資料過期之後,通過過期策略來將資料清理。通過資料庫判斷資料是否過期無疑是比通過程式判斷要好的多。redis的過期策略有兩種分別是定期刪除和懶惰刪除
定期刪除:redis預設是每隔 100ms 就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除。 這裡不是遍歷所有的key,資料量大的情況下,若是遍歷所有的key,會占用大量的資源(也不知道cpu撐不撐得住)
懶惰刪除:聽著這個名字就有夠懶了,實際上真的是懶得不能行。對於定期刪除沒有能夠刪除的鍵值對,當呼叫這個key的時候,redis的懶惰刪除機制會判斷一下這個key是否過期,若是過期就刪除(只要你不找他,他就不找你,懶得要命)
接下來我們來想乙個問題,通過這兩個機制,我們能不能把所有的過期鍵值對都刪掉,定期刪除的隨機性具有很大的偶然性,經過懶惰刪除機制,只要不呼叫,也不會被發現,哎呀,那不是可能有很多漏網之魚嘛?這可咋整!
當記憶體被占用過多的時候,redis就祭出大招,記憶體淘汰機制!
redis 提供 6種資料淘汰策略:
volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key(這個是最常用的)
allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
no-eviction:禁止驅逐資料,也就是說當記憶體不足以容納新寫入資料時,新寫入操作會報錯。這個應該沒人使用吧!
4.0版本後增加以下兩種:
volatile-lfu:從已設定過期時間的資料集(server.db[i].expires)中挑選最不經常使用的資料淘汰
allkeys-lfu:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最不經常使用的key
redis 過期 淘汰 事務原子機制
set key value ex 60 鍵值對存活60秒 set key value px 60 鍵值對存活60毫秒 expire key 60 key60秒之後失效,在2.6版本之後使用pexpire設定毫秒數 3 檢視乙個key的有效期 ttl key 在2.6版本以上可以使用pttl,檢視毫秒...
redis過期機制和淘汰策略
redis的過期key刪除機制 這樣就會導致乙個問題,假設乙個key過期了,我也不去訪問。他就會一直存在記憶體當中,所以可能會導致記憶體滿掉,因此redis還引入了記憶體淘汰機制。通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據配置項配...
Redis 快取過期處理與記憶體淘汰機制
計算機記憶體有限,越大越貴,redis的高併發高效能都是基於記憶體的,用硬碟的話gg。設定了expire的key快取過期了,但是伺服器的記憶體還是會被占用,這是因為redis所基於的兩種刪除策略 redis有兩種策略 主動 定時刪除 被動 惰性刪除 所以,雖然key過期了,但是只要沒有被redis清...