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

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

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

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

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 16:01 ? 次閱讀

Redis 中所有的鍵都可以設(shè)置過(guò)期策略,就像是所有的鍵都可以上"生死簿",上了生死簿的鍵到時(shí)間后閻王就會(huì)叉掉這個(gè)鍵。同一時(shí)間大量的鍵過(guò)期,閻王就會(huì)忙不過(guò)來(lái)。同時(shí)因?yàn)?Redis 是單線程的,導(dǎo)致閻王的處理時(shí)間會(huì)變得很長(zhǎng),而且處理繁忙,Redis 就會(huì)出現(xiàn)卡頓現(xiàn)象。

Redis 有三種策略刪除過(guò)期 Key

相關(guān)命令

expire key seconds  # 過(guò)期時(shí)間為秒數(shù),key 不存在時(shí)返回(integer) 0,key 存在的時(shí)返回(integer) 1

pexpire key milliseconds # 同 expire,設(shè)置的過(guò)期時(shí)間為毫秒數(shù)

setex key seconds value # 只能設(shè)置字符串的過(guò)期時(shí)間

ttl key # 查看 Key 的過(guò)期時(shí)間(秒數(shù)),用不過(guò)期返回(integer) -1,Key 不存在返回(integer) -2

pttl key # 同 ttl,返回毫秒數(shù)

過(guò)期 Key

Redis 的每個(gè)設(shè)置了過(guò)期時(shí)間的 Key 都會(huì)放在一個(gè)獨(dú)立的字典中,用于遍歷刪除。

過(guò)期策略

被動(dòng)刪除

Key 在被操作時(shí),Redis 主動(dòng)檢查 Key 是否過(guò)期,過(guò)期則刪除,返回 nil

  1. 對(duì) CPU 友好,只有 Key 在被操作時(shí)刪除,不會(huì)浪費(fèi) CPU 時(shí)間
  2. 對(duì)內(nèi)存不友好,如果同時(shí)有大量的 Key 過(guò)期,這些 Key 在被使用之前不會(huì)被刪除,就會(huì)浪費(fèi)內(nèi)存

主動(dòng)刪除

Redis 會(huì)周期性的隨機(jī)掃描一批設(shè)置了過(guò)期時(shí)間的 Key 并進(jìn)行處理,Redis 每秒進(jìn)行10次過(guò)期掃描會(huì)做的操作有:

  1. 隨機(jī)掃描100個(gè)設(shè)置了過(guò)期時(shí)間的 Key
  2. 刪除所有發(fā)現(xiàn)的過(guò)期 Key
  3. 如果刪除的 Key 超過(guò)1/4則重復(fù)步驟1
hz 10

Redis 除了設(shè)置每秒10次的掃描頻率之外,還設(shè)置了每次掃描不會(huì)超過(guò)25ms 的上限,以防出現(xiàn)過(guò)度循環(huán)掃描,導(dǎo)致線程卡死。

maxmemory

# maxmemory

當(dāng)已用的內(nèi)存超過(guò) maxmemory 配置的內(nèi)存時(shí),會(huì)觸發(fā)主動(dòng)清除策略

# maxmemory-policy noeviction
  1. noeviction 永不過(guò)期策略,當(dāng)已用內(nèi)存超過(guò) maxmemory 配置時(shí),寫操作將返回錯(cuò)誤,讀操作和 del 操作可以繼續(xù)服務(wù)。
  2. volatile-lru 只刪除設(shè)置了過(guò)期時(shí)間的 Key,使用頻率越少的 Key 優(yōu)先刪除,不會(huì)對(duì)沒(méi)有設(shè)置過(guò)期時(shí)間的 Key 刪除
  3. volatile-ttl 和上面一樣,只刪除設(shè)置過(guò)期時(shí)間的 Key,TTL 過(guò)期時(shí)間越少優(yōu)先刪除
  4. volatile-random 隨機(jī)刪除快要過(guò)期的 Key
  5. allkeys-lru 和 lru 一樣,刪除所有的 Key,沒(méi)有設(shè)置過(guò)期時(shí)間的 Key 也會(huì)被刪除
  6. allkeys-random 和上面一樣,刪除掉隨機(jī)的 Key

Redis 采用的過(guò)期策略

被動(dòng)刪除+主動(dòng)刪除

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

    關(guān)注

    68

    文章

    10699

    瀏覽量

    209353
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88308
  • key
    key
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    12789
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    我用labSQL中的ADO Recordset Delete Record.vi 函數(shù)刪除數(shù)據(jù)庫(kù)中的一

    求助:我用labSQL中的ADO Recordset Delete Record.vi 函數(shù)刪除數(shù)據(jù)庫(kù)中的一行記錄,為啥不得行呢?運(yùn)行之后,數(shù)據(jù)庫(kù)里面并沒(méi)有刪除???出現(xiàn)的問(wèn)題是:ADO
    發(fā)表于 12-02 14:57

    請(qǐng)問(wèn)LabVIEW如何刪除數(shù)組中的空白元素

    請(qǐng)問(wèn)LabVIEW如何刪除數(shù)組中的空白元素還有如何把一行一行的字符串組成的數(shù)組分別填寫到表格中
    發(fā)表于 02-17 13:19

    刪除數(shù)組元素

    刪除數(shù)組元素作為條件結(jié)構(gòu)的條件輸入端是怎么回事啊。。。
    發(fā)表于 03-30 15:51

    刪除數(shù)組里指定的多個(gè)相同元素

    如題,如何刪除數(shù)組里指定的多個(gè)相同元素,求大神指導(dǎo)、、、
    發(fā)表于 12-26 13:32

    在labview使用sql語(yǔ)句刪除數(shù)據(jù)庫(kù)中的重復(fù)內(nèi)容出現(xiàn)錯(cuò)誤,求解

    最近一直在自學(xué)使用labview控制數(shù)據(jù)庫(kù),相關(guān)的書(shū)籍資料都不多,有相同興趣的歡迎溝通互相學(xué)習(xí)使用labsql一直出現(xiàn)問(wèn)題,之前排序的運(yùn)行成功卻發(fā)現(xiàn)只是對(duì)查詢數(shù)據(jù)進(jìn)行排序不能對(duì)本身這次需要刪除數(shù)據(jù)庫(kù)中重復(fù)內(nèi)容,我查找了相關(guān)語(yǔ)句,
    發(fā)表于 03-07 12:30

    刪除數(shù)字字符串無(wú)效零

    看到有人問(wèn)怎么刪除數(shù)字字符串的無(wú)效零,所以在這里發(fā)一下!可以像圖中這樣使用
    發(fā)表于 01-03 19:42

    刪除數(shù)組中的零元素

    提供了兩種刪除數(shù)組零元素的方法,前一種略麻煩,重新設(shè)計(jì)了一種,可能是我知道的最簡(jiǎn)單粗暴的版本了吧
    發(fā)表于 03-22 22:37

    《Visual C# 2008程序設(shè)計(jì)經(jīng)典案例設(shè)計(jì)與實(shí)現(xiàn)》---動(dòng)態(tài)刪除數(shù)據(jù)庫(kù)數(shù)據(jù)信息

    《Visual C# 2008程序設(shè)計(jì)經(jīng)典案例設(shè)計(jì)與實(shí)現(xiàn)》---動(dòng)態(tài)刪除數(shù)據(jù)庫(kù)數(shù)據(jù)信息.zip
    發(fā)表于 06-25 16:48

    如何使得redis中的數(shù)據(jù)不再有

    嵌入式Linux系統(tǒng)重啟后如何使得redis中的數(shù)據(jù)不再有今天在工作中遇到一個(gè)問(wèn)題:網(wǎng)頁(yè)展示redis中的數(shù)據(jù),然而再Linux系統(tǒng)重啟后網(wǎng)頁(yè)還能展示
    發(fā)表于 11-05 08:50

    JAVA教程之創(chuàng)建與刪除數(shù)據(jù)庫(kù)中的表

    JAVA教程之創(chuàng)建與刪除數(shù)據(jù)庫(kù)中的表,很好的JAVA的資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-13 09:47 ?3次下載

    手機(jī)如何永久刪除數(shù)據(jù)

    為了保護(hù)隱私,在切換舊手機(jī)之前,需要完全清除手機(jī)數(shù)據(jù)。它一直是我們恢復(fù)出廠設(shè)置的最常用方法?;謴?fù)出廠設(shè)置的舊手機(jī),其他人仍然可以恢復(fù)已刪除的照片、數(shù)據(jù)。那么如何徹底刪除舊手機(jī)上的
    的頭像 發(fā)表于 03-01 14:53 ?2.9w次閱讀

    如何才能刪除SQL數(shù)據(jù)局鏡像

    SQLSERVER刪除數(shù)據(jù)庫(kù)鏡像 SQLServer刪除數(shù)據(jù)庫(kù)鏡像,其實(shí)這之前有個(gè)很詭異的問(wèn)題。..在數(shù)據(jù)庫(kù)鏡像斷開(kāi)后,如何從新建立鏡像的連接呢?
    發(fā)表于 09-26 17:51 ?18次下載

    微軟「全息云存儲(chǔ)」來(lái)了!玻璃做介質(zhì),用光記錄或刪除數(shù)據(jù)

    你能想象嗎,未來(lái)有望實(shí)現(xiàn) 全系存儲(chǔ)了!什么意思呢,就是利用光來(lái)記錄數(shù)據(jù)頁(yè)、玻璃作為介質(zhì)實(shí)現(xiàn)云上存儲(chǔ)。全息晶體可以填充密集的數(shù)據(jù),若想刪除數(shù)據(jù),只需用紫外光就能擦除,也太酷了吧! 這是微軟研究院的一項(xiàng)
    的頭像 發(fā)表于 10-27 13:39 ?3012次閱讀

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

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

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

    執(zhí)行之前都會(huì)調(diào)用 expireIfNeeded函數(shù)對(duì)其進(jìn)行檢查,如果過(guò)期,則刪除該鍵,然后執(zhí)行鍵不存在的操作;未過(guò)期則不作操作,繼續(xù)執(zhí)行原有的命令。 定期刪除:由Redis.c/activeExpireCycle 函數(shù)實(shí)現(xiàn),函數(shù)
    的頭像 發(fā)表于 10-09 11:06 ?408次閱讀