深度解析:Redis內(nèi)存淘汰策略及其應(yīng)用場景

2024-12-17 13:59 更新

大家好,我是 V 哥,粉絲小A面試阿里,說被問到 Redis 的內(nèi)存淘汰策略的問題,整理這個筆記給他參考,也分享給大家,如果你遇到這個問題,會怎么回答呢? Redis 的內(nèi)存淘汰策略是指當(dāng)Redis的內(nèi)存使用量達(dá)到設(shè)定的上限時,決定哪些數(shù)據(jù)應(yīng)該被移除以便為新數(shù)據(jù)騰出空間的規(guī)則。Redis 提供了多種內(nèi)存淘汰策略,可以通過配置文件中的 maxmemory-policy 指令來設(shè)置。以下是 Redis 支持的主要內(nèi)存淘汰策略: noeviction:這是默認(rèn)策略,當(dāng)內(nèi)存使用達(dá)到限制時,Redis 會拒絕新的寫入操作,并返回錯誤,但不會淘汰任何數(shù)據(jù)。 allkeys-lru:在所有鍵中,基于最近最少使用(LRU)算法淘汰數(shù)據(jù)。Redis 會維護(hù)一個近似的 LRU 列表,并不保證完全精確,但是對大多數(shù)使用場景來說是足夠的。 allkeys-lfu:在所有鍵中,基于最少頻率使用(LFU)算法淘汰數(shù)據(jù)。LFU 算法會跟蹤每個鍵的訪問頻率,并淘汰訪問頻率最低的鍵。 volatile-lru:僅在設(shè)置了過期時間的鍵中,基于 LRU 算法淘汰數(shù)據(jù)。 volatile-lfu:僅在設(shè)置了過期時間的鍵中,基于 LFU 算法淘汰數(shù)據(jù)。 volatile-random:在設(shè)置了過期時間的鍵中隨機(jī)選擇淘汰。 allkeys-random:在所有鍵中隨機(jī)選擇淘汰。 volatile-ttl:在設(shè)置了過期時間的鍵中,淘汰那些 TTL(Time To Live)值最小的鍵,也就是即將過期的鍵。 以上是8種不同的淘汰策略,選擇哪種淘汰策略取決于具體的使用場景和業(yè)務(wù)需求。例如,如果你希望 Redis 作為緩存使用,并且緩存的數(shù)據(jù)大多是臨時性的,那么可能會選擇 allkeys-lruvolatile-lru。如果你的應(yīng)用中有明確的熱點(diǎn)數(shù)據(jù),可能會選擇 allkeys-lfuvolatile-lfu 來確保熱點(diǎn)數(shù)據(jù)不會被輕易淘汰。 Redis 還提供了一些工具和命令來幫助監(jiān)控和優(yōu)化內(nèi)存使用,例如 INFO memory 命令可以查看內(nèi)存使用情況,CONFIG SET maxmemory 可以動態(tài)調(diào)整內(nèi)存上限。 在 Redis 4.0 版本后引入了 MEMORY 命令,可以更細(xì)致地管理和分析內(nèi)存使用情況。例如,MEMORY USAGE 可以估算鍵值對的內(nèi)存使用量,MEMORY STATS 可以顯示內(nèi)存使用的詳細(xì)信息。 Redis 的內(nèi)存淘汰是在后臺異步進(jìn)行的,因此即使達(dá)到了內(nèi)存上限,也不會立即淘汰數(shù)據(jù),而是在新的寫入操作發(fā)生時根據(jù)配置的策略進(jìn)行淘汰。

noeviction

noeviction 是 Redis 默認(rèn)的內(nèi)存淘汰策略。當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 配置的限制時,如果嘗試執(zhí)行可能導(dǎo)致更多內(nèi)存使用的命令(如 SET、LPUSH、SADD 等),Redis 將返回錯誤,而不是淘汰任何現(xiàn)有的鍵值對。

在以下應(yīng)用場景中可以使用

數(shù)據(jù)保留:如果你的應(yīng)用場景中,每個數(shù)據(jù)項(xiàng)都非常重要,不能丟失,那么 noeviction 策略可以確保即使在高內(nèi)存使用的情況下,數(shù)據(jù)也不會被自動淘汰。 內(nèi)存充足的環(huán)境:如果你的服務(wù)器有足夠的內(nèi)存,或者 Redis 實(shí)例被限制在一個相對較小的數(shù)據(jù)集上,那么使用 noeviction 策略可以避免復(fù)雜的淘汰邏輯,簡化內(nèi)存管理。 消息隊(duì)列:在某些使用 Redis 作為消息隊(duì)列的場景中,可能會希望確保所有消息都能被處理,而不是在內(nèi)存壓力下丟失消息。 緩存預(yù)熱:在緩存預(yù)熱階段,可能會希望保持緩存數(shù)據(jù)的完整性,直到緩存穩(wěn)定后再根據(jù)實(shí)際訪問模式進(jìn)行淘汰。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy noeviction 來啟用 noeviction 策略。   maxmemory-policy noeviction 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。   127.0.0.1:6379> CONFIG SET maxmemory-policy noeviction 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。   redis-server --maxmemory-policy noeviction

小結(jié)一下

當(dāng)設(shè)置為 noeviction 時,Redis 會記錄內(nèi)存使用量,但不會主動淘汰任何鍵值對。 如果內(nèi)存使用量達(dá)到限制,Redis 會拒絕那些可能會增加內(nèi)存使用的命令,并返回錯誤信息,如 (error)OOM command not allowed when used memory>'maxmemory'。 這種策略下,只有當(dāng)客戶端顯式地刪除鍵值對或鍵值對過期時,內(nèi)存才會被釋放。 由于不自動淘汰數(shù)據(jù),使用 noeviction 策略時需要更加謹(jǐn)慎地監(jiān)控內(nèi)存使用情況,并確保有足夠的內(nèi)存空間來處理數(shù)據(jù)的增長。

敲黑板啦,注意事項(xiàng)

使用 noeviction 策略時,需要確保服務(wù)器有足夠的內(nèi)存來處理數(shù)據(jù)的增長,否則 Redis 可能會因?yàn)閮?nèi)存不足而無法處理新的寫入請求。 在某些情況下,如果 Redis 長時間無法處理寫入請求,可能會導(dǎo)致客戶端操作超時或錯誤,影響應(yīng)用程序的正常運(yùn)行。 如果你的應(yīng)用可以容忍數(shù)據(jù)的丟失,或者有其他機(jī)制來處理數(shù)據(jù)淘汰(如定期清理舊數(shù)據(jù)),那么可以考慮使用其他淘汰策略來更有效地管理內(nèi)存。

allkeys-lru

allkeys-lru 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "all keys least recently used"。這種策略會在所有鍵中,包括那些沒有設(shè)置過期時間的鍵,基于最近最少使用算法(LRU)來淘汰數(shù)據(jù)。

適合的應(yīng)用場景

緩存應(yīng)用:在緩存場景中,通常需要保留最近被訪問的數(shù)據(jù),以便快速響應(yīng)后續(xù)的讀取請求。allkeys-lru 策略可以確保緩存中的數(shù)據(jù)是最近被訪問的,從而提高緩存效率。 數(shù)據(jù)訪問模式均勻:如果你的應(yīng)用中所有數(shù)據(jù)的訪問模式相對均勻,沒有特別明顯的熱點(diǎn)數(shù)據(jù),那么 allkeys-lru 可以作為一個合理的選擇,因?yàn)樗鼤蕴畈换钴S的數(shù)據(jù)。 數(shù)據(jù)替換:在某些應(yīng)用中,可能需要定期替換舊數(shù)據(jù)以保持?jǐn)?shù)據(jù)的新鮮度,allkeys-lru 策略可以幫助實(shí)現(xiàn)這一點(diǎn)。 內(nèi)存限制嚴(yán)格:在內(nèi)存使用有嚴(yán)格限制的環(huán)境中,allkeys-lru 可以作為一種自動的數(shù)據(jù)淘汰機(jī)制,以確保內(nèi)存使用不會超過設(shè)定的限制。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy allkeys-lru 來啟用 allkeys-lru 策略。 maxmemory-policy allkeys-lru 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。   redis-server --maxmemory-policy allkeys-lru

小結(jié)一下

LRU 算法:最近最少使用(LRU)是一種常見的頁面置換算法,它基于這樣一個假設(shè):如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高。LRU 算法會跟蹤每個數(shù)據(jù)項(xiàng)的訪問時間,并在需要淘汰數(shù)據(jù)時選擇最久未被訪問的數(shù)據(jù)。 淘汰過程:當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 限制時,Redis 會根據(jù) LRU 算法淘汰最久未被訪問的鍵值對,直到內(nèi)存使用量降到限制以下。 近似實(shí)現(xiàn):Redis 實(shí)現(xiàn)的 LRU 算法是一個近似版本,它通過定期檢查一組隨機(jī)鍵,并淘汰其中最久未被訪問的鍵來工作。這樣可以在不犧牲太多性能的情況下,近似地實(shí)現(xiàn) LRU 算法。 配置樣本大小:Redis 允許你通過 maxmemory-samples 配置來調(diào)整用于淘汰決策的鍵樣本大小。增加樣本大小可以提高淘汰決策的準(zhǔn)確性,但可能會增加 CPU 的使用率。

敲黑板:注意的地方

數(shù)據(jù)丟失:使用 allkeys-lru 策略時,需要意識到一些最近沒有被訪問的數(shù)據(jù)可能會被自動淘汰,這可能導(dǎo)致數(shù)據(jù)丟失。 性能考慮:雖然 LRU 算法可以提高緩存命中率,但 Redis 需要維護(hù)額外的訪問時間信息,這可能會對性能產(chǎn)生一定影響。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 allkeys-lru 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)訪問模式,確保該策略與業(yè)務(wù)目標(biāo)一致。

allkeys-lfu

allkeys-lfu 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "all keys least frequently used"。這種策略會在所有鍵中,包括那些沒有設(shè)置過期時間的鍵,基于最少頻率使用算法(LFU)來淘汰數(shù)據(jù)。

適合用的應(yīng)用場景

訪問模式不均勻:在數(shù)據(jù)訪問模式不均勻的情況下,某些鍵可能被頻繁訪問,而另一些鍵則很少被訪問。allkeys-lfu 策略可以確保經(jīng)常訪問的鍵不會被輕易淘汰。 熱點(diǎn)數(shù)據(jù)保留:如果你的應(yīng)用中有熱點(diǎn)數(shù)據(jù),即那些被頻繁訪問的數(shù)據(jù),使用 allkeys-lfu 策略可以確保這些熱點(diǎn)數(shù)據(jù)不會因?yàn)樽罱钌偈褂盟惴ǘ徽`淘汰。 數(shù)據(jù)重要性:在某些應(yīng)用中,數(shù)據(jù)的重要性與其被訪問的頻率成正比。使用 allkeys-lfu 策略可以保留那些被認(rèn)為更重要的數(shù)據(jù)。 避免數(shù)據(jù)抖動:在一些實(shí)時性要求高的應(yīng)用中,如推薦系統(tǒng)或?qū)崟r分析系統(tǒng),使用 allkeys-lfu 策略可以減少因?yàn)閿?shù)據(jù)被淘汰而導(dǎo)致的抖動。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy allkeys-lfu 來啟用 allkeys-lfu 策略。   maxmemory-policy allkeys-lfu 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lfu 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy allkeys-lfu

小結(jié)一下

LFU 算法:最少頻率使用(LFU)是一種頁面置換算法,它基于數(shù)據(jù)項(xiàng)的訪問頻率來淘汰數(shù)據(jù)。LFU 算法會跟蹤每個數(shù)據(jù)項(xiàng)的訪問次數(shù),并在需要淘汰數(shù)據(jù)時選擇訪問次數(shù)最少的數(shù)據(jù)。 淘汰過程:當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 限制時,Redis 會根據(jù) LFU 算法淘汰訪問次數(shù)最少的鍵值對,直到內(nèi)存使用量降到限制以下。 近似實(shí)現(xiàn):Redis 實(shí)現(xiàn)的 LFU 算法是一個近似版本,它通過維護(hù)一個計數(shù)器來跟蹤每個鍵的訪問頻率,并在需要淘汰數(shù)據(jù)時選擇訪問頻率最低的鍵。 配置頻率衰減:Redis 允許通過 lfu-decay-time 配置項(xiàng)來設(shè)置訪問頻率的衰減時間,這有助于平衡最近訪問頻率和長期訪問頻率的重要性。

敲黑板:注意事項(xiàng)

數(shù)據(jù)淘汰:使用 allkeys-lfu 策略時,需要意識到那些訪問頻率較低的數(shù)據(jù)可能會被自動淘汰,這可能導(dǎo)致某些數(shù)據(jù)的丟失。 性能考慮:雖然 LFU 算法可以保留重要的熱點(diǎn)數(shù)據(jù),但 Redis 需要維護(hù)額外的訪問計數(shù)器,這可能會對性能產(chǎn)生一定影響。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 allkeys-lfu 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)訪問模式,確保該策略與業(yè)務(wù)目標(biāo)一致。 算法精度:Redis 的 LFU 實(shí)現(xiàn)是一個近似算法,它通過定期檢查一組隨機(jī)鍵,并淘汰其中訪問頻率最低的鍵來工作。這樣可以在不犧牲太多性能的情況下,近似地實(shí)現(xiàn) LFU 算法。

volatile-lru

volatile-lru 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "volatile keys least recently used"。這種策略僅針對設(shè)置了過期時間的鍵,基于最近最少使用算法(LRU)來淘汰數(shù)據(jù)。

適合的應(yīng)用場景

緩存與過期數(shù)據(jù):在緩存數(shù)據(jù)時,通常會為緩存項(xiàng)設(shè)置一個過期時間。volatile-lru 策略可以確保在內(nèi)存不足時,最近最少被使用的過期鍵首先被移除。 臨時數(shù)據(jù)存儲:對于需要臨時存儲的數(shù)據(jù),如會話信息或臨時計算結(jié)果,這些數(shù)據(jù)通常有明確的過期時間。使用 volatile-lru 策略可以有效地管理這些臨時數(shù)據(jù)。 熱點(diǎn)數(shù)據(jù)保護(hù):如果你希望保護(hù)那些沒有設(shè)置過期時間的熱點(diǎn)數(shù)據(jù)不被誤淘汰,volatile-lru 策略可以確保只有那些即將過期的數(shù)據(jù)才會被考慮淘汰。 數(shù)據(jù)時效性:在數(shù)據(jù)具有較強(qiáng)時效性的場景中,如新聞文章或?qū)崟r數(shù)據(jù),使用 volatile-lru 策略可以確保舊數(shù)據(jù)在內(nèi)存不足時被優(yōu)先淘汰。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy volatile-lru 來啟用 volatile-lru 策略。 maxmemory-policy volatile-lru 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。 127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lru 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy volatile-lru

小結(jié)一下

LRU 算法:最近最少使用(LRU)是一種常見的頁面置換算法,它基于這樣一個假設(shè):如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高。LRU 算法會跟蹤每個數(shù)據(jù)項(xiàng)的訪問時間,并在需要淘汰數(shù)據(jù)時選擇最久未被訪問的數(shù)據(jù)。 淘汰過程:當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 限制時,Redis 會根據(jù) LRU 算法淘汰最久未被訪問的設(shè)置了過期時間的鍵值對,直到內(nèi)存使用量降到限制以下。 近似實(shí)現(xiàn):Redis 實(shí)現(xiàn)的 LRU 算法是一個近似版本,它通過定期檢查一組隨機(jī)鍵,并淘汰其中最久未被訪問的鍵來工作。這樣可以在不犧牲太多性能的情況下,近似地實(shí)現(xiàn) LRU 算法。 配置樣本大?。篟edis 允許你通過 maxmemory-samples 配置來調(diào)整用于淘汰決策的鍵樣本大小。增加樣本大小可以提高淘汰決策的準(zhǔn)確性,但可能會增加 CPU 的使用率。

duangduangduang 注意一下

數(shù)據(jù)淘汰:使用 volatile-lru 策略時,需要意識到那些最近沒有被訪問且即將過期的數(shù)據(jù)可能會被自動淘汰,這可能導(dǎo)致數(shù)據(jù)丟失。 性能考慮:雖然 LRU 算法可以提高緩存命中率,但 Redis 需要維護(hù)額外的訪問時間信息,這可能會對性能產(chǎn)生一定影響。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 volatile-lru 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)訪問模式,確保該策略與業(yè)務(wù)目標(biāo)一致。 數(shù)據(jù)保護(hù):如果你的應(yīng)用中有重要的數(shù)據(jù)沒有設(shè)置過期時間,需要注意 volatile-lru 策略不會淘汰這些數(shù)據(jù),從而可以保護(hù)這些數(shù)據(jù)不被誤淘汰。

volatile-lfu

volatile-lfu 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "volatile keys least frequently used"。這種策略僅針對設(shè)置了過期時間的鍵,基于最少頻率使用算法(LFU)來淘汰數(shù)據(jù)。

適合的應(yīng)用場景

緩存與頻率限制:在緩存數(shù)據(jù)時,如果某些數(shù)據(jù)項(xiàng)被訪問的頻率非常低,即使它們最近被訪問過,也可能不是很重要。volatile-lfu 策略可以確保這些不常訪問的鍵被優(yōu)先淘汰。 臨時數(shù)據(jù)存儲:對于有明確過期時間的臨時數(shù)據(jù),如用戶會話或緩存的API響應(yīng),volatile-lfu 策略可以在內(nèi)存不足時,根據(jù)訪問頻率來淘汰這些臨時數(shù)據(jù)。 數(shù)據(jù)時效性與訪問頻率:在數(shù)據(jù)具有較強(qiáng)時效性且訪問頻率不均勻的場景中,volatile-lfu 策略可以結(jié)合時效性和訪問頻率來決定數(shù)據(jù)的保留優(yōu)先級。 熱點(diǎn)數(shù)據(jù)與臨時數(shù)據(jù)的平衡:如果你希望保護(hù)那些頻繁訪問的臨時數(shù)據(jù)不被輕易淘汰,同時淘汰那些不常訪問的臨時數(shù)據(jù),volatile-lfu 策略可以實(shí)現(xiàn)這種平衡。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy volatile-lfu 來啟用 volatile-lfu 策略。 maxmemory-policy volatile-lfu 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。 127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lfu 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy volatile-lfu

小結(jié)一下

LFU 算法:最少頻率使用(LFU)是一種頁面置換算法,它基于數(shù)據(jù)項(xiàng)的訪問頻率來淘汰數(shù)據(jù)。LFU 算法會跟蹤每個數(shù)據(jù)項(xiàng)的訪問次數(shù),并在需要淘汰數(shù)據(jù)時選擇訪問次數(shù)最少的數(shù)據(jù)。 淘汰過程:當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 限制時,Redis 會根據(jù) LFU 算法淘汰設(shè)置了過期時間但訪問次數(shù)最少的鍵值對,直到內(nèi)存使用量降到限制以下。 近似實(shí)現(xiàn):Redis 實(shí)現(xiàn)的 LFU 算法是一個近似版本,它通過維護(hù)一個計數(shù)器來跟蹤每個鍵的訪問頻率,并在需要淘汰數(shù)據(jù)時選擇訪問頻率最低的鍵。 配置頻率衰減:Redis 允許通過 lfu-decay-time 配置項(xiàng)來設(shè)置訪問頻率的衰減時間,這有助于平衡最近訪問頻率和長期訪問頻率的重要性。

注意 注意

數(shù)據(jù)淘汰:使用 volatile-lfu 策略時,需要意識到那些訪問頻率較低且即將過期的數(shù)據(jù)可能會被自動淘汰,這可能導(dǎo)致數(shù)據(jù)丟失。 性能考慮:雖然 LFU 算法可以保留重要的熱點(diǎn)數(shù)據(jù),但 Redis 需要維護(hù)額外的訪問計數(shù)器,這可能會對性能產(chǎn)生一定影響。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 volatile-lfu 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)訪問模式,確保該策略與業(yè)務(wù)目標(biāo)一致。 算法精度:Redis 的 LFU 實(shí)現(xiàn)是一個近似算法,它通過定期檢查一組隨機(jī)鍵,并淘汰其中訪問頻率最低的鍵來工作。這樣可以在不犧牲太多性能的情況下,近似地實(shí)現(xiàn) LFU 算法。

volatile-random

volatile-random 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "volatile keys random"。這種策略僅針對設(shè)置了過期時間的鍵,隨機(jī)淘汰數(shù)據(jù)。

適合的應(yīng)用場景

過期數(shù)據(jù)的不確定性:當(dāng)你希望在內(nèi)存不足時隨機(jī)淘汰一些即將過期的數(shù)據(jù),而不是基于訪問模式或頻率時,volatile-random 是一個合適的選擇。 簡化的淘汰邏輯:如果你不需要復(fù)雜的淘汰邏輯,而只是希望在內(nèi)存壓力下隨機(jī)釋放一些空間,那么 volatile-random 策略可以滿足需求。 臨時數(shù)據(jù)存儲:對于存儲臨時數(shù)據(jù)的場景,如緩存的會話信息或臨時計算結(jié)果,如果這些數(shù)據(jù)的丟失不會對系統(tǒng)造成重大影響,可以使用 volatile-random 策略。 避免熱點(diǎn)數(shù)據(jù)誤傷:如果你希望避免基于訪問模式淘汰數(shù)據(jù),從而可能誤傷熱點(diǎn)數(shù)據(jù),volatile-random 策略可以提供一個更為“公平”的淘汰機(jī)制。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy volatile-random 來啟用 volatile-random 策略。 maxmemory-policy volatile-random 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。 127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-random 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy volatile-random

小結(jié)一下

隨機(jī)淘汰:volatile-random 策略會在達(dá)到內(nèi)存限制時,從所有設(shè)置了過期時間的鍵中隨機(jī)選擇一些鍵進(jìn)行淘汰。 淘汰過程:Redis 會維護(hù)一個設(shè)置了過期時間的鍵的列表,當(dāng)需要淘汰數(shù)據(jù)時,它會從這個列表中隨機(jī)選擇鍵來淘汰,直到內(nèi)存使用量降到限制以下。 簡單且快速:這種策略的實(shí)現(xiàn)相對簡單,不需要跟蹤每個鍵的訪問時間或頻率,因此在執(zhí)行淘汰操作時可以非??焖?。 公平性:由于淘汰是基于隨機(jī)性的,因此這種策略在一定程度上可以認(rèn)為是“公平”的,因?yàn)樗黄蛴谌魏翁囟ǖ臄?shù)據(jù)。

注意

數(shù)據(jù)淘汰的不確定性:使用 volatile-random 策略時,任何設(shè)置了過期時間的數(shù)據(jù)都有可能被淘汰,這可能導(dǎo)致一些重要的數(shù)據(jù)被意外淘汰。 性能考慮:雖然隨機(jī)淘汰策略的實(shí)現(xiàn)簡單且快速,但頻繁的淘汰操作可能會對性能產(chǎn)生一定影響,尤其是在內(nèi)存使用率較高時。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 volatile-random 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)的重要性,確保該策略與業(yè)務(wù)目標(biāo)一致。 數(shù)據(jù)保護(hù):如果你的應(yīng)用中有重要的數(shù)據(jù)設(shè)置了過期時間,需要注意 volatile-random 策略可能會淘汰這些數(shù)據(jù),從而需要考慮額外的數(shù)據(jù)保護(hù)措施。

allkeys-random

allkeys-random 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "all keys random"。這種策略會在所有鍵中,無論是否設(shè)置了過期時間,隨機(jī)淘汰數(shù)據(jù)。

適合的應(yīng)用場景

無差別數(shù)據(jù):如果你的緩存數(shù)據(jù)沒有明顯的訪問模式差異,即所有數(shù)據(jù)的訪問頻率和重要性都差不多,那么 allkeys-random 可以作為一個簡單的淘汰策略。 負(fù)載均衡:在分布式緩存環(huán)境中,如果所有節(jié)點(diǎn)的內(nèi)存容量都接近上限,使用 allkeys-random 策略可以確保淘汰操作在各個節(jié)點(diǎn)之間相對均衡。 非關(guān)鍵數(shù)據(jù):如果你緩存的數(shù)據(jù)是非關(guān)鍵數(shù)據(jù),即使部分?jǐn)?shù)據(jù)被隨機(jī)淘汰也不會對業(yè)務(wù)造成顯著影響,那么這種策略可以減少系統(tǒng)的復(fù)雜性。 臨時解決方案:在緊急情況下,如內(nèi)存泄漏或其他問題導(dǎo)致內(nèi)存壓力突然增大,allkeys-random 可以作為一個快速反應(yīng)的淘汰策略。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy allkeys-random 來啟用 allkeys-random 策略。 maxmemory-policy allkeys-random 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。 127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-random 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy allkeys-random

小結(jié)一下

隨機(jī)淘汰:allkeys-random 策略會在達(dá)到內(nèi)存限制時,從所有鍵中隨機(jī)選擇一些鍵進(jìn)行淘汰。 淘汰過程:Redis 會維護(hù)一個所有鍵的列表,當(dāng)需要淘汰數(shù)據(jù)時,它會從這個列表中隨機(jī)選擇鍵來淘汰,直到內(nèi)存使用量降到限制以下。 簡單且快速:這種策略的實(shí)現(xiàn)相對簡單,不需要跟蹤每個鍵的訪問時間或頻率,因此在執(zhí)行淘汰操作時可以非常快速。 公平性:由于淘汰是基于隨機(jī)性的,因此這種策略在一定程度上可以認(rèn)為是“公平”的,因?yàn)樗黄蛴谌魏翁囟ǖ臄?shù)據(jù)。

注意一下

數(shù)據(jù)淘汰的不確定性:使用 allkeys-random 策略時,任何數(shù)據(jù)都有可能被淘汰,這可能導(dǎo)致一些重要的數(shù)據(jù)被意外淘汰。 性能考慮:雖然隨機(jī)淘汰策略的實(shí)現(xiàn)簡單且快速,但頻繁的淘汰操作可能會對性能產(chǎn)生一定影響,尤其是在內(nèi)存使用率較高時。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 allkeys-random 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)的重要性,確保該策略與業(yè)務(wù)目標(biāo)一致。 數(shù)據(jù)保護(hù):如果你的應(yīng)用中有重要的數(shù)據(jù),需要注意 allkeys-random 策略可能會淘汰這些數(shù)據(jù),從而需要考慮額外的數(shù)據(jù)保護(hù)措施。

volatile-ttl

volatile-ttl 是 Redis 的一種內(nèi)存淘汰策略,全稱為 "volatile keys with the smallest Time To Live"。這種策略僅針對設(shè)置了過期時間的鍵,淘汰那些剩余生存時間(TTL)最短的鍵。

適合的應(yīng)用場景

臨時數(shù)據(jù)緩存:對于那些有明確過期時間的臨時數(shù)據(jù),如會話信息、定時任務(wù)結(jié)果等,volatile-ttl 策略可以確保這些數(shù)據(jù)在內(nèi)存不足時按照 TTL 順序被清除。 數(shù)據(jù)時效性管理:在數(shù)據(jù)具有較強(qiáng)時效性的場景中,如新聞快訊或?qū)崟r報價,volatile-ttl 策略可以確保最接近過期的數(shù)據(jù)首先被移除。 過期數(shù)據(jù)優(yōu)先淘汰:如果你希望在內(nèi)存不足時優(yōu)先淘汰那些即將過期的數(shù)據(jù),而不是其他數(shù)據(jù),volatile-ttl 提供了一種直接的方式來實(shí)現(xiàn)這一目標(biāo)。 內(nèi)存優(yōu)化:在內(nèi)存資源有限的情況下,volatile-ttl 策略可以幫助優(yōu)化內(nèi)存使用,確保內(nèi)存中的數(shù)據(jù)盡可能是有用的,即將過期的數(shù)據(jù)被及時清除。

怎么用

配置文件設(shè)置:在 Redis 配置文件 redis.conf 中,可以通過設(shè)置 maxmemory-policy volatile-ttl 來啟用 volatile-ttl 策略。 maxmemory-policy volatile-ttl 運(yùn)行時設(shè)置:也可以在 Redis 運(yùn)行時使用 CONFIG SET 命令來動態(tài)更改內(nèi)存淘汰策略。 127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-ttl 命令行設(shè)置:如果你使用的是 Redis 命令行工具,也可以在啟動 Redis 服務(wù)時通過命令行參數(shù)設(shè)置。 redis-server --maxmemory-policy volatile-ttl

小結(jié)一下

TTL 淘汰:volatile-ttl 策略會根據(jù)鍵的剩余生存時間來淘汰數(shù)據(jù)。Redis 會跟蹤每個設(shè)置了過期時間的鍵的 TTL,并在需要淘汰數(shù)據(jù)時選擇 TTL 最短的鍵。 淘汰過程:當(dāng) Redis 的內(nèi)存使用量達(dá)到 maxmemory 限制時,Redis 會查找所有設(shè)置了過期時間的鍵,并淘汰那些 TTL 最短的鍵,直到內(nèi)存使用量降到限制以下。 實(shí)時性:這種策略可以確保內(nèi)存中的數(shù)據(jù)盡可能是最新的,因?yàn)樗鼉A向于淘汰那些即將過期的數(shù)據(jù)。 配置樣本大?。弘m然 volatile-ttl 策略不涉及 maxmemory-samples 的配置,但它仍然需要定期檢查鍵的 TTL,以便做出淘汰決策。

要注意的情況

數(shù)據(jù)淘汰的不確定性:使用 volatile-ttl 策略時,需要注意即使某些數(shù)據(jù)的 TTL 很短,它們也可能在內(nèi)存不足時被保留,這取決于其他鍵的 TTL 值。 性能考慮:雖然 TTL 淘汰策略的實(shí)現(xiàn)相對簡單,但頻繁的淘汰操作可能會對性能產(chǎn)生一定影響,尤其是在內(nèi)存使用率較高時。 監(jiān)控:建議監(jiān)控 Redis 的內(nèi)存使用情況和淘汰事件,以確保系統(tǒng)按預(yù)期工作,并及時調(diào)整策略或增加內(nèi)存資源。 業(yè)務(wù)適配:在決定使用 volatile-ttl 策略之前,應(yīng)考慮業(yè)務(wù)需求和數(shù)據(jù)的時效性,確保該策略與業(yè)務(wù)目標(biāo)一致。 數(shù)據(jù)保護(hù):如果你的應(yīng)用中有重要的數(shù)據(jù)設(shè)置了過期時間,需要注意 volatile-ttl 策略可能會淘汰這些數(shù)據(jù),從而需要考慮額外的數(shù)據(jù)保護(hù)措施。

最后

以上是 V 哥整理的筆記,分享給你,歡迎關(guān)注威哥愛編程,專注技術(shù)學(xué)習(xí)與成長,絕不躺平。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號