Redis的過期和淘汰是兩回事兒
早期文章
? ? ? ? 做程序員的競爭越來越大,有一種三百六十行,行行轉程序員的感覺。當程序員的想著轉行做送外賣逃離 007、996,送外賣的卻想著轉行當程序員。看到群里小伙伴發(fā)的照片,想起以前一個阿姨在地鐵上學 Java Web 的照片,真的是太卷了……不,是太勵志了!


? ? ? ? 今天整理一下關于 Redis 的過期策略和淘汰機制,這兩個東西看著很像,其實不是一回事兒。
過期策略
? ? ? ? 我們在使用 Redis 當作緩存時,通常會給 Redis 的 Key 設置一個過期時間,被設置過期時間的 Key 在未過期時可以對其進行讀取或更新操作,也可以主動將其刪除。當其超過設置的時間后,它將失效。通過它的過期機制,可以完成很多功能,比如計數(shù)器復位、token 過期等。
? ? ????那么,Redis 對已經過期的數(shù)據(jù)是進行如何處理,或者說是如何刪除呢?在 Redis 中有兩種策略來刪除過期的 Key,分別是 主動刪除和 被動刪除?兩種方式,也有資料稱為 定期刪除?和?惰性刪除。
被動刪除(惰性刪除)
? ? ? ??被動刪除也被稱為惰性刪除,是 Redis 中的 Key 已經過期,但是 Redis 不會主動將其刪除,當有客戶端訪問該過期 Key 時,Redis 對其進行檢查,發(fā)現(xiàn)其過期則將其刪除,并返回 null 給客戶端。
主動刪除(定期刪除)
? ? ? ? 惰性刪除有它的優(yōu)點,不會浪費太多的系統(tǒng)資源,但是也存在相應的問題,就是已經過期的 Key 如果不再被訪問,就不會被刪除了,這樣會浪費不必要的存儲空間。因此 Redis 存在一種主動刪除過期 Key 的策略。
? ? ? ??主動刪除也被稱為定期刪除,Redis 會定期掃描已經設置了過期時間的 Key,然后從中刪除已經過期的 Key。Redis 默認一秒鐘完成 10 次這樣的掃描,它大概的流程如下:
從設定了過期的 Key 中隨機抽取 20 個 Key?進行過期檢測
刪除所有已經過期的 Key
如果有本次刪除的 Key?超過 25%,那么重復第一步
? ? ? ? 如果有大量的 Key 過期,這樣的掃描可能會導致線程卡頓,因此每次掃描的時長最長為 25ms。
? ? ? ? 以上是 Redis 處理過期 Key 的方案,當 Redis 服務器占用的內存空間超過最大允許內存之后,會觸發(fā)內存的淘汰策略。
淘汰策略
? ? ? ? 內存淘汰策略是指 Redis 使用的內存達到或超過其配置的最大內存時觸發(fā)的一種保護策略,它根據(jù)具體的策略來淘汰一些 Key 使得 Redis 可以繼續(xù)運行。在 Redis 4.0 之后的版本中,Redis 的內存淘汰策略共有 8 種。
noeviction:內存達到配置的最大內存時,不再接受新增 Key 的操作,它是默認配置
allkeys-lru:在所有 Key 中,保留最近使用的 Key,刪除最近最少使用的 Key
allkeys-lfu:在所有 Key 中,保留常用的 Key,刪除最不常用的 Key
allkeys-random:在所有 Key 中,隨機刪除一些 Key
volatile-lru:在設置了過期時間的 Key 中,刪除最近最少使用的 Key
volatile-lfu:在設置了過期時間的 Key 中,刪除最不常用的 Key
volatile-random:在設置了過期時間的 Key 中,隨機刪除一些 Key
volatile-ttl:在設置了過期時間的 Key 中,刪除最短剩余生存時間中最不常用的 Key
? ? ? ? 從上面的策略中可以看出,大體分為兩類,分別是 allkeys 和 volatile 兩種。allkeys 是所有的 Key,volatile 是設置了過期時間的 Key。在 allkeys 和 volatile 中使用兩個淘汰策略是 LRU 和 LFU,即 最近最少使用(確切的是 近似 LRU 算法) 和 最不常用 兩種。
小結
? ? ? ??過期和淘汰是兩回事,過期是對設置過期時間的 Key 進行刪除的一種機制,而淘汰是當使用內存超過設置最大內存時觸發(fā)的一種保護機制,雖然它也會刪除一些 Key。上面整理的是關于 Redis 的過期和淘汰的知識點,具體應該怎么設置淘汰策略,官網給出了建議。需要了解 LRU 和 LFU 算法也可以在官網得到具體的說明。


公眾號內回復?【mongo】 下載 SpringBoot 整合操作 MongoDB 的文檔。
公眾號內回復?【cisp知識整理】 下載 CISP 讀書筆記。
公眾號內回復【java開發(fā)手冊】獲取《Java開發(fā)手冊》黃山版。
