0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis的刪除策略和內(nèi)存淘汰機(jī)制介紹

麥辣雞腿堡 ? 來源:程序員庫森 ? 作者:程序員庫森 ? 2023-10-09 11:06 ? 次閱讀

Redis過期鍵的刪除策略?

Redis的過期刪除策略就是:惰性刪除和定期刪除兩種策略配合使用。

惰性刪除:Redis的惰性刪除策略由db.c/expireIfNeeded函數(shù)實(shí)現(xiàn),所有鍵讀寫命令執(zhí)行之前都會(huì)調(diào)用 expireIfNeeded函數(shù)對(duì)其進(jìn)行檢查,如果過期,則刪除該鍵,然后執(zhí)行鍵不存在的操作;未過期則不作操作,繼續(xù)執(zhí)行原有的命令。

定期刪除:由Redis.c/activeExpireCycle 函數(shù)實(shí)現(xiàn),函數(shù)以一定的頻率運(yùn)行,每次運(yùn)行時(shí),都從一定數(shù)量的數(shù)據(jù)庫中取出一定數(shù)量的隨機(jī)鍵進(jìn)行檢查,并刪除其中的過期鍵。

附:刪除key常見的三種處理方式。

1、定時(shí)刪除

在設(shè)置某個(gè)key 的過期時(shí)間同時(shí),我們創(chuàng)建一個(gè)定時(shí)器,讓定時(shí)器在該過期時(shí)間到來時(shí),立即執(zhí)行對(duì)其進(jìn)行刪除的操作。

優(yōu)點(diǎn):定時(shí)刪除對(duì)內(nèi)存是最友好的,能夠保存內(nèi)存的key一旦過期就能立即從內(nèi)存中刪除。

缺點(diǎn):對(duì)CPU最不友好,在過期鍵比較多的時(shí)候,刪除過期鍵會(huì)占用一部分 CPU 時(shí)間,對(duì)服務(wù)器的響應(yīng)時(shí)間和吞吐量造成影響。

2、惰性刪除

設(shè)置該key 過期時(shí)間后,我們不去管它,當(dāng)需要該key時(shí),我們?cè)跈z查其是否過期,如果過期,我們就刪掉它,反之返回該key。

優(yōu)點(diǎn):對(duì) CPU友好,我們只會(huì)在使用該鍵時(shí)才會(huì)進(jìn)行過期檢查,對(duì)于很多用不到的key不用浪費(fèi)時(shí)間進(jìn)行過期檢查。

缺點(diǎn):對(duì)內(nèi)存不友好,如果一個(gè)鍵已經(jīng)過期,但是一直沒有使用,那么該鍵就會(huì)一直存在內(nèi)存中,如果數(shù)據(jù)庫中有很多這種使用不到的過期鍵,這些鍵便永遠(yuǎn)不會(huì)被刪除,內(nèi)存永遠(yuǎn)不會(huì)釋放。從而造成內(nèi)存泄漏。

3、定期刪除

每隔一段時(shí)間,我們就對(duì)一些key進(jìn)行檢查,刪除里面過期的key。

優(yōu)點(diǎn):可以通過限制刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率來減少刪除操作對(duì) CPU 的影響。另外定期刪除,也能有效釋放過期鍵占用的內(nèi)存。

缺點(diǎn):難以確定刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率。如果執(zhí)行的太頻繁,定期刪除策略變得和定時(shí)刪除策略一樣,對(duì)CPU不友好。如果執(zhí)行的太少,那又和惰性刪除一樣了,過期鍵占用的內(nèi)存不會(huì)及時(shí)得到釋放。另外最重要的是,在獲取某個(gè)鍵時(shí),如果某個(gè)鍵的過期時(shí)間已經(jīng)到了,但是還沒執(zhí)行定期刪除,那么就會(huì)返回這個(gè)鍵的值,這是業(yè)務(wù)不能忍受的錯(cuò)誤。

Redis內(nèi)存淘汰機(jī)制?

當(dāng)現(xiàn)有內(nèi)存大于 maxmemory 時(shí),便會(huì)觸發(fā)Redis主動(dòng)淘汰內(nèi)存方式,有如下幾種淘汰方式:

Redis 4.0前提供 6種數(shù)據(jù)淘汰策略:

volatile-lru:利用LRU算法移除設(shè)置過過期時(shí)間的key (LRU:最近使用 Least Recently Used )

allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key(這個(gè)是最常用的)

volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰

volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

no-eviction:禁止驅(qū)逐數(shù)據(jù),也就是說當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會(huì)報(bào)錯(cuò)。這個(gè)應(yīng)該沒人使用吧!

Redis 4.0后增加以下兩種:

volatile-lfu:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最不經(jīng)常使用的數(shù)據(jù)淘汰(LFU(Least Frequently Used)算法,也就是最頻繁被訪問的數(shù)據(jù)將來最有可能被訪問到)

allkeys-lfu:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最不經(jīng)常使用的key。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2966

    瀏覽量

    73812
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    370

    瀏覽量

    10830
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何排查Redis性能問題 Redis內(nèi)部實(shí)現(xiàn)原理解析

    作為業(yè)務(wù)開發(fā)人員,我們需要了解 Redis 的基本原理,例如各個(gè)命令執(zhí)行的時(shí)間復(fù)雜度、數(shù)據(jù)過期策略、數(shù)據(jù)淘汰策略等,從而更合理地使用 Redis
    發(fā)表于 07-05 12:33 ?319次閱讀
    如何排查<b class='flag-5'>Redis</b>性能問題 <b class='flag-5'>Redis</b>內(nèi)部實(shí)現(xiàn)原理解析

    Redis內(nèi)存淘汰機(jī)制

    redis淘汰策略
    發(fā)表于 09-27 07:55

    淺析Redis的過期機(jī)制

    Redis數(shù)據(jù)過期策略詳解
    發(fā)表于 10-12 15:12

    Redis的發(fā)布訂閱機(jī)制

    Redis之發(fā)布訂閱機(jī)制
    發(fā)表于 06-11 13:21

    Redis常見面試題及答案

    redis的數(shù)據(jù)類型,以及每種數(shù)據(jù)類型的使用場(chǎng)景,Redis 內(nèi)部結(jié)構(gòu) redis的過期策略以及內(nèi)存
    的頭像 發(fā)表于 12-16 11:44 ?2155次閱讀
    <b class='flag-5'>Redis</b>常見面試題及答案

    Redis持久化機(jī)制的實(shí)現(xiàn)原理和使用技巧

    Redis將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,宕機(jī)或重啟都會(huì)使內(nèi)存數(shù)據(jù)全部丟失, Redis的持久化機(jī)制用來保證數(shù)據(jù)不會(huì)因?yàn)楣收隙鴣G失。
    的頭像 發(fā)表于 09-13 16:42 ?973次閱讀

    redis緩存滿了怎么辦?

    只有在 Redis 的運(yùn)行內(nèi)存達(dá)到了某個(gè)閥值,才會(huì)觸發(fā)內(nèi)存淘汰機(jī)制,這個(gè)閥值就是我們?cè)O(shè)置的最大運(yùn)行內(nèi)存
    發(fā)表于 08-21 10:42 ?220次閱讀
    <b class='flag-5'>redis</b>緩存滿了怎么辦?

    Redis 的數(shù)據(jù)清理策略

    本文整理 Redis 的數(shù)據(jù)清理策略所有代碼來自 Redis version :5.0, 不同版本的 Redis 策略可能有調(diào)整
    發(fā)表于 09-19 14:24 ?341次閱讀
    <b class='flag-5'>Redis</b> 的數(shù)據(jù)清理<b class='flag-5'>策略</b>

    Redis持久化機(jī)制介紹

    Redis持久化機(jī)制? 為了能夠重用Redis數(shù)據(jù),或者防止系統(tǒng)故障,我們需要將Redis中的數(shù)據(jù)寫入到磁盤空間中,即持久化。Redis提供
    的頭像 發(fā)表于 10-09 11:44 ?458次閱讀
    <b class='flag-5'>Redis</b>持久化<b class='flag-5'>機(jī)制</b><b class='flag-5'>介紹</b>

    Redis 如何刪除數(shù)據(jù)

    閻王的處理時(shí)間會(huì)變得很長(zhǎng),而且處理繁忙,Redis 就會(huì)出現(xiàn)卡頓現(xiàn)象。 Redis 有三種策略刪除過期 Key 相關(guān)命令 expire key seconds # 過期時(shí)間為秒數(shù), k
    的頭像 發(fā)表于 10-09 16:01 ?465次閱讀

    為什么使用top命令時(shí),Redis還是占了很多內(nèi)存

    實(shí)際上,這是因?yàn)?,?dāng)數(shù)據(jù)刪除后,Redis 釋放的內(nèi)存空間會(huì)由內(nèi)存分配器管理,并不會(huì)立即返回給操作系統(tǒng)。所以,操作系統(tǒng)仍然會(huì)記錄著給 Redis
    的頭像 發(fā)表于 12-01 09:25 ?595次閱讀
    為什么使用top命令時(shí),<b class='flag-5'>Redis</b>還是占了很多<b class='flag-5'>內(nèi)存</b>?

    redis機(jī)制原理

    Redis是一款高性能的開源內(nèi)存數(shù)據(jù)庫,用于存儲(chǔ)和檢索數(shù)據(jù)。在多線程或分布式環(huán)境中,需要實(shí)現(xiàn)并發(fā)控制來保證數(shù)據(jù)一致性和線程安全。Redis提供了一種簡(jiǎn)單而高效的鎖機(jī)制,可以用來實(shí)現(xiàn)并發(fā)
    的頭像 發(fā)表于 12-04 11:08 ?1175次閱讀

    redis淘汰策略

    Redis是一種基于內(nèi)存的鍵值存儲(chǔ)系統(tǒng),為了充分利用內(nèi)存,Redis采用了一些淘汰策略來管理
    的頭像 發(fā)表于 12-04 16:23 ?515次閱讀

    redis的lru原理

    Redis是一種基于內(nèi)存的鍵值數(shù)據(jù)庫,它使用了LRU(Least Recently Used)算法來進(jìn)行緩存的數(shù)據(jù)淘汰。LRU算法的核心思想是最近最少使用的數(shù)據(jù)將會(huì)在未來也不常用,因此應(yīng)該優(yōu)先
    的頭像 發(fā)表于 12-05 09:56 ?591次閱讀

    redis持久化機(jī)制優(yōu)缺點(diǎn)

    Redis是一個(gè)基于內(nèi)存的高性能鍵值存儲(chǔ)系統(tǒng),它提供了多種持久化機(jī)制來保證數(shù)據(jù)的可靠性。本文將詳細(xì)介紹Redis的持久化
    的頭像 發(fā)表于 12-05 10:03 ?654次閱讀