溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis緩存的淘汰策略是什么

發(fā)布時(shí)間:2021-10-27 11:27:37 來源:億速云 閱讀:167 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要講解了“Redis緩存的淘汰策略是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Redis緩存的淘汰策略是什么”吧!

Redis緩存的淘汰策略是什么

Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù),是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API?!鞠嚓P(guān)推薦:Redis視頻教程】

它具備以下的特征:

  • 基于內(nèi)存運(yùn)行,具備高性能的特點(diǎn)

  • 支持分布式,理論上可以無限拓展

  • key-value 存儲(chǔ)結(jié)構(gòu),查詢高效

  • 提供多種開發(fā)語言 API, 容易和現(xiàn)有的業(yè)務(wù)系統(tǒng)集成。

通常在業(yè)務(wù)系統(tǒng)種用作分布式緩存,集中式 Session 存儲(chǔ), 分布式鎖等運(yùn)用場(chǎng)景。

不管是本地緩存還是分布式緩存,為了保證較高性能,都是使用內(nèi)存來保存數(shù)據(jù),由于成本和內(nèi)存限制,當(dāng)存儲(chǔ)的數(shù)據(jù)超過緩存容量時(shí),需要對(duì)緩存的數(shù)據(jù)進(jìn)行剔除。 一般的剔除策略有 FIFO 淘汰最早數(shù)據(jù)、LRU 剔除最近最少使用、和 LFU 剔除最近使用頻率最低的數(shù)據(jù)幾種策略。

Redis 緩存淘汰策略觸發(fā)

在生產(chǎn)環(huán)境中我們是不允許 redis 出現(xiàn) swap 行為的。所以一般會(huì)限制最大的使用內(nèi)存,redis 提供了配置參數(shù) maxmemory 來規(guī)定最大的使用內(nèi)存。

以下配置均為合法:

maxmemory 1000KB 
maxmemory 100MB 
maxmemory 1GB 
maxmemory 0  # 表示不做限制,一般不會(huì)用

redis.conf 配置文件如下

Redis緩存的淘汰策略是什么

8 種 Redis 緩存策略

  • volatile-lru 設(shè)定超時(shí)時(shí)間的數(shù)據(jù)中,刪除最不常用的數(shù)據(jù);

  • allkeys-lru 查詢所有的key 中最不常使用的數(shù)據(jù)進(jìn)行刪除,這是應(yīng)用最廣泛的策略;

  • volatile-random 在已經(jīng)設(shè)定了超時(shí)的數(shù)據(jù)中隨機(jī)刪除;

  • allkeys-random 查詢所有的 key 之后隨機(jī)刪除;

  • volatile-ttl 查詢?nèi)吭O(shè)定超時(shí)時(shí)間的數(shù)據(jù),追后馬上排序,將馬上將要過期的數(shù)據(jù)進(jìn)行刪除操作;

  • noeviction (默認(rèn)) 如果設(shè)置為該屬性,則不會(huì)進(jìn)行刪除操作,如果內(nèi)存溢出則報(bào)錯(cuò)返回;

  • volatile-lfu 從所有配置了過期的時(shí)間的鍵中驅(qū)逐使用頻率最少的鍵;

  • allkeys-lfu 從所有鍵中驅(qū)逐使用頻率最少的鍵;

Redis 種的 LRU 與 LFU 算法

LRU 算法

Redis LRU 算法不是一個(gè)精確的實(shí)現(xiàn)。這意味著 Redis 無法選擇最佳的驅(qū)逐候選者,即過去訪問次數(shù)最多的訪問。相反,它會(huì)嘗試運(yùn)行 LRU 算法的近似值,方法是對(duì)少量密鑰進(jìn)行采樣,然后逐出采樣密鑰中最好的(具有最早訪問時(shí)間)的密鑰。

然而,從 Redis 3.0 開始,該算法得到了改進(jìn),也可以選擇一些好的候選者進(jìn)行驅(qū)逐。這提高了算法的性能,使其能夠更接近真實(shí) LRU 算法的行為。

Redis LRU 算法的重要之處在于,您可以通過更改樣本數(shù)量來調(diào)整算法的精度,以檢查每次驅(qū)逐。此參數(shù)由以下配置指令控制:

maxmemory-samples 5

Redis 之所以不使用真正的 LRU 實(shí)現(xiàn),是因?yàn)樗枰嗟膬?nèi)存。然而,對(duì)于使用 Redis 的應(yīng)用程序,近似值實(shí)際上是等效的。下面是Redis使用的LRU近似與真實(shí)LRU的對(duì)比圖。

Redis緩存的淘汰策略是什么

生成上述圖表的測(cè)試使用給定數(shù)量的鍵填充了 Redis 服務(wù)器。從第一個(gè)到最后一個(gè)訪問密鑰,因此第一個(gè)密鑰是使用 LRU 算法驅(qū)逐的最佳候選者。后來又添加了 50% 的密鑰,以強(qiáng)制驅(qū)逐一半的舊密鑰。

您可以在圖中看到三種點(diǎn),形成三個(gè)不同的帶。

  • 淺灰色帶是被驅(qū)逐的對(duì)象。

  • 灰色帶是未被驅(qū)逐的對(duì)象。

  • 綠色帶是添加的對(duì)象。

在理論上的 LRU 實(shí)現(xiàn)中,我們預(yù)計(jì)在舊密鑰中,前半部分將過期。Redis LRU 算法只會(huì)在概率上使舊密鑰過期。

LRU 只是一個(gè)模型,用于預(yù)測(cè)給定密鑰在未來被訪問的可能性。此外,如果您的數(shù)據(jù)訪問模式非常類似于冪律,則大多數(shù)訪問將位于 LRU 近似算法能夠很好處理的鍵集中。

缺點(diǎn):可能會(huì)存在一定時(shí)間內(nèi)大量的冷數(shù)數(shù)據(jù)被訪問產(chǎn)生大量的熱點(diǎn)數(shù)據(jù)

LFU 算法

從 Redis 4.0 開始,可以使用新的最不常用驅(qū)逐模式。這種模式在某些情況下可能會(huì)更好(提供更好的命中率/未命中率),因?yàn)槭褂?LFU Redis 會(huì)嘗試跟蹤項(xiàng)目的訪問頻率,因此很少使用的項(xiàng)目會(huì)被驅(qū)逐,而經(jīng)常使用的項(xiàng)目有更高的機(jī)會(huì)留在記憶中。

如果您認(rèn)為在 LRU,最近訪問過但實(shí)際上幾乎從未被請(qǐng)求過的項(xiàng)目不會(huì)過期,因此風(fēng)險(xiǎn)是驅(qū)逐將來有更高機(jī)會(huì)被請(qǐng)求的密鑰。LFU 沒有這個(gè)問題,一般應(yīng)該更好地適應(yīng)不同的訪問模式。

配置LFU模式,可以使用以下策略:

  • volatile-lfu 在具有過期集的鍵中使用近似 LFU 驅(qū)逐。

  • allkeys-lfu 使用近似 LFU 驅(qū)逐任何密鑰。

LFU 類似于 LRU:它使用一個(gè)概率計(jì)數(shù)器,稱為莫里斯計(jì)數(shù)器,以便僅使用每個(gè)對(duì)象的幾位來估計(jì)對(duì)象訪問頻率,并結(jié)合衰減周期,以便計(jì)數(shù)器隨著時(shí)間的推移而減少:在某些時(shí)候,我們不再希望將密鑰視為經(jīng)常訪問的密鑰,即使它們過去是這樣,以便算法可以適應(yīng)訪問模式的轉(zhuǎn)變。

這些信息的采樣與 LRU 發(fā)生的情況類似(如本文檔的前一部分所述),以便選擇驅(qū)逐的候選人。

然而,與 LRU 不同的是,LFU 具有某些可調(diào)參數(shù):例如,如果不再訪問頻繁項(xiàng),它的排名應(yīng)該以多快的速度降低?還可以調(diào)整 Morris 計(jì)數(shù)器范圍,以便更好地使算法適應(yīng)特定用例。

默認(rèn)情況下,Redis 4.0 配置為:

  • 在大約一百萬個(gè)請(qǐng)求時(shí)使計(jì)數(shù)器飽和。

  • 每一分鐘衰減一次計(jì)數(shù)器。

這些應(yīng)該是合理的值并經(jīng)過實(shí)驗(yàn)測(cè)試,但用戶可能希望使用這些配置設(shè)置以選擇最佳值。

有關(guān)如何調(diào)整這些參數(shù)的說明可以redis.conf在源代碼分發(fā)的示例文件中找到,但簡(jiǎn)單地說,它們是:

lfu-log-factor 10 
lfu-decay-time 1

衰減時(shí)間是顯而易見的,它是計(jì)數(shù)器應(yīng)該衰減的分鐘數(shù),當(dāng)采樣并發(fā)現(xiàn)它比該值更舊時(shí)。一個(gè)特殊值0意味著:每次掃描時(shí)總是衰減計(jì)數(shù)器,很少有用。

計(jì)數(shù)器對(duì)數(shù)因子會(huì)改變需要多少次命中才能使頻率計(jì)數(shù)器飽和,這恰好在 0-255 的范圍內(nèi)。系數(shù)越高,需要越多的訪問以達(dá)到最大值。根據(jù)下表,系數(shù)越低,低訪問計(jì)數(shù)器的分辨率越好:

+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255        |
+--------+------------+------------+------------+------------+------------+

淘汰最近一段時(shí)間被訪問次數(shù)最少的數(shù)據(jù),以次數(shù)作為參考。

缺點(diǎn):

1. 最近加入的數(shù)據(jù)常常容易被剔除,因?yàn)槠淦鹗挤椒ù螖?shù)比較少,

2. 如果頻率時(shí)間度量為 1 個(gè)小時(shí),則平均一天每個(gè)小時(shí)內(nèi)訪問頻率 1000 的熱點(diǎn)數(shù)據(jù)可能會(huì)被 2個(gè)小時(shí)的一段時(shí)間訪問的頻率為 1001 的數(shù)據(jù)剔除掉??赡軙?huì)出現(xiàn)一些臨界值的數(shù)據(jù)。

緩存策略設(shè)置建議

建議:了解Redis 的淘汰策略之后,在平時(shí)使用盡量主動(dòng)設(shè)置/更新 key 的 expire 時(shí)間主動(dòng)剔除不活躍的舊數(shù)據(jù), 有助于提升查詢性能

感謝各位的閱讀,以上就是“Redis緩存的淘汰策略是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Redis緩存的淘汰策略是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI