快取問題 五 Redis 快取過期刪除機制

2021-10-10 10:43:10 字數 2239 閱讀 8340

redis 無論有沒有設定expire, 都會遵循redis的配置好的刪除機制,  規則如下:  

預設的規則是volatile-lru設定了expire的key,  將會在過期時間到後刪除;沒有設定expire的快取key,

不會被刪除;   當到達最大設定記憶體maxmemory時redis先刪除設定了過期時間且過期的, 如果不滿足記憶體要求,然後會按lru演算法刪除設定了過期時間但還沒有過期的key,  如果還是不能滿足記憶體需求, 將oom

redis 無論有沒有設定expire, 都會遵循redis的配置好的刪除機制, 在配置檔案裡設定:

redis 最大記憶體不足"時,資料清除策略,預設為" volatile-lru

volatile-lru ->

"過期集合"中的資料採取lru(近期最少使用)演算法.

如果對key使用"expire"指令指定了過期時間, 那麼此key將會被新增到"過期集合"中。

首先將已經過期的資料優先移除. 若不能滿足最大記憶體maxmemory設定,

繼續使用lru演算法刪除設定expire但還是沒有過期的key,

如果"過期集合" 中全部移除仍不能滿足記憶體需求,將oom.

allkeys-lru -> 對所有的資料,採用lru演算法,

volatile-random -> 對"過期集合"中的資料採取"隨即選取"演算法,並移除選中的k-v,直到"記憶體足夠"為止.

如果"過期集合" 中全部移除全部移除仍不能滿足,將oom

allkeys-random -> 對所有的資料,採取"隨機選取"演算法,並移除選中的k-v,直到"記憶體足夠"為止

volatile-ttl -> 對"過期集合"中的資料採取ttl演算法(最小存活時間),移除即將過期的資料.

noeviction -> 不做任何干擾操作,直接返回oom異常

如果資料的過期不會對"應用系統"帶來異常,且系統中write操作比較密集,建議採取allkeys-lru

以上可以看出,對沒設定expire的資料,產生影響的是 allkeys-lru 機制,allkeys-random。

所以redis 對沒設定expire的資料是否會刪除, 是由你自己選擇的刪除機制決定的。

在redis伺服器占用記憶體達到maxmemory最大的情況下,當再想增加記憶體占用時,會按maxmemory-policy刪除機制將老的資料刪除。

這裡簡單說一下volatile-lru,該模式下 redis會按lru演算法刪除設定了過期時間但還沒有過期的key,而對於沒有設定過期時間的key,redis是永遠保留的。

當然,如果你不想刪除沒有過期的key,那可以使用 noeviction機制, 不做任何刪除操作,直接返回oom異常.

如果乙個鍵是過期的,那它到了過期時間之後是不是馬上就從記憶體中被被刪除呢??如果不是,那過期後到底什麼時候被刪除呢??

其實有三種不同的刪除策略:

(2):惰性刪除。鍵過期了就過期了,不管。每次從dict字典中按key取值時,先檢查此key是否已經過期,如果過期了就刪除它,並返回nil,如果沒過期,就返回鍵值。

(3):定時刪除。每隔一段時間,對expires字典進行檢查,刪除裡面的過期鍵。

可以看到,第二種為被動刪除,第一種和第三種為主動刪除,且第一種實時性更高。下面對這三種刪除策略進行具體分析。

而且目前redis事件處理器對時間事件的處理方式--無序鍊錶,查詢乙個key的時間複雜度為o(n),所以並不適合用來處理大量的時間事件。

2.2. 惰性刪除

惰性刪除是指,某個鍵值過期後,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。所以惰性刪除的缺點很明顯:浪費記憶體。dict字典和expires字典都要儲存這個鍵值的資訊。

舉個例子,對於一些按時間點來更新的資料,比如log日誌,過期後在很長的一段時間內可能都得不到訪問,這樣在這段時間內就要拜拜浪費這麼多記憶體來存log。這對於效能非常依賴於記憶體大小的redis來說,是比較致命的

2.3 定時刪除

定時刪除是:每隔一段時間執行一次刪除操作,並通過限制刪除操作執行的時長和頻率,來減少刪除操作對cpu的影響。另一方面定時刪除也有效的減少了因惰性刪除帶來的記憶體浪費。

Redis快取過期機制

redis可以通過設定乙個過期時間expire來處理快取,其中處理方式有兩種 主動 定期刪除,redis會抽查隨機的key,預設1秒十次,一旦抽查的key過期了,就會給刪除,配置的屬性在redis.conf中,hz等於10,表示1秒抽查10次 hz 10 被動 惰性刪除,key到期後不去主動檢測,而...

監聽Redis快取key過期

有些業務需要延遲一定時間後執行,比如訂單提交後15分鐘未支付就自動關閉,這裡只是舉個例子。我們可以通過監聽redis的key過期事件來實現這個功能。新增redis依賴 org.springframework.boot spring boot starter data redis 配置訊息監聽容器,把...

Redis快取鍵的過期策略

命令名功能 expire 將鍵的生存時間設定為ttl秒 pexpire 將鍵的生存時間設定為ttl毫秒 expireat 將鍵的生存時間設定為timestamp指定的秒數時間戳 pexpireat 將鍵的生存時間設定為timestamp指定的毫秒數時間戳 前三個命令最終都會轉換成pexpireat命...