您好,登錄后才能下訂單哦!
這篇文章主要講解了“Redis緩存的淘汰策略是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“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ù)幾種策略。
在生產(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 配置文件如下
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ū)逐使用頻率最少的鍵;
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ì)比圖。
生成上述圖表的測(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ù)。
建議:了解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)注!
免責(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)容。