溫馨提示×

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

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

Redis刪除策略和逐出策略是什么

發(fā)布時(shí)間:2020-08-29 09:14:10 來(lái)源:億速云 閱讀:514 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章主要介紹了Redis刪除策略和逐出策略是什么,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

過(guò)期數(shù)據(jù)

先來(lái)看三個(gè)key值,分別為sex、name、age。

這三個(gè)值設(shè)置的指令為 set name kaka setex age 100 24 setex sex 10 1

Redis刪除策略和逐出策略是什么在redis中我們可以使用ttl來(lái)獲取某個(gè)key的狀態(tài),下面我們來(lái)使用ttl分別獲取一下上邊name、age、sex的狀態(tài)

可以看到出來(lái)了三個(gè)值,分別為 -1  775   -2

那么這三個(gè)值給出的信息是什么呢!

  • -1 表示永久有效的數(shù)據(jù)
  • 775 這個(gè)值是設(shè)置在age上,使用的指令為setex age 1000 24,表示為剩余有效時(shí)間
  • -2 表示已經(jīng)過(guò)期的數(shù)據(jù),或者是被刪除的數(shù)據(jù),或者說(shuō)是么有定義的數(shù)據(jù)Redis刪除策略和逐出策略是什么

過(guò)期數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)

  • 當(dāng)我們?cè)O(shè)置一個(gè)帶有時(shí)效性的name時(shí),redis存儲(chǔ)的是一個(gè)內(nèi)存地址0x10101
  • 然后redis會(huì)再開(kāi)辟一個(gè)空間用來(lái)存儲(chǔ)帶有時(shí)效性的key
  • 但是存儲(chǔ)方式是key對(duì)應(yīng)的內(nèi)存地址  和  過(guò)期時(shí)間Redis刪除策略和逐出策略是什么那么今天我們所說(shuō)的redis刪除策略,就是刪除的這部分?jǐn)?shù)據(jù)。

定時(shí)刪除

定時(shí)刪除就是寫(xiě)一個(gè)定時(shí)器,然后當(dāng)key的時(shí)間過(guò)期后,定時(shí)器任務(wù)立即對(duì)過(guò)期的key進(jìn)行刪除

優(yōu)點(diǎn):可想而知key到期就刪,肯定對(duì)內(nèi)存時(shí)最友好的,節(jié)約內(nèi)存

缺點(diǎn):redis單線程的特性是所有的命令都在按照一定的順序進(jìn)行執(zhí)行。key值到期就刪cpu的壓力就會(huì)變大,會(huì)直接影響到redis服務(wù)器響應(yīng)時(shí)間和IO

定時(shí)刪除就是用時(shí)間來(lái)?yè)Q取空間

當(dāng)執(zhí)行完定時(shí)刪除后,key值對(duì)應(yīng)的數(shù)據(jù)會(huì)被刪除,同時(shí)在過(guò)期的內(nèi)存區(qū)里邊也會(huì)直接刪除。Redis刪除策略和逐出策略是什么

惰性刪除

在來(lái)看這個(gè)圖當(dāng)key值過(guò)期后不會(huì)直接刪除,那是什么時(shí)候刪除呢!繼續(xù)往下看Redis刪除策略和逐出策略是什么

當(dāng)我們使用惰性刪除時(shí),數(shù)據(jù)到期了也不會(huì)自動(dòng)刪除,那么他的刪除方式是,在下一次在獲取這個(gè)key值時(shí),會(huì)做一個(gè)判斷,判斷這個(gè)key是否過(guò)期,如果過(guò)期了在執(zhí)行刪除。

也就是說(shuō)當(dāng)再次執(zhí)行g(shù)et name時(shí)  會(huì)走一個(gè)函數(shù)expirelfNeeded()  這個(gè)函數(shù)就是判斷此key是否過(guò)期的。過(guò)期的返回nil,然后從內(nèi)存在進(jìn)行刪除

Redis刪除策略和逐出策略是什么優(yōu)點(diǎn):會(huì)減少一定的CPU性能,只有到必須要?jiǎng)h的時(shí)候才會(huì)刪除

缺點(diǎn):那肯定就是內(nèi)存壓力大了,例如一些熱點(diǎn)新聞,熱點(diǎn)過(guò)了就基本沒(méi)人訪問(wèn)了,沒(méi)有人訪問(wèn)這個(gè)key就一直存在,就會(huì)出現(xiàn)長(zhǎng)期占用一定的內(nèi)存空間

也就說(shuō)這種方式是用空間換時(shí)間

定期刪除

在上文中我們提及了倆種刪除方式,一種是定時(shí)刪除,一種是惰性刪除。一個(gè)是用空間換時(shí)間。一個(gè)是用時(shí)間換空間。倆種方案都是比較極端的方式。那么接下來(lái)我們?cè)趤?lái)看看定期刪除的實(shí)現(xiàn)方案。

先來(lái)看一下redis的存儲(chǔ)空間,一共有默認(rèn)為16個(gè),在redis.conf里邊有一個(gè)配置參數(shù)database這個(gè)參數(shù)控制的。每個(gè)數(shù)據(jù)庫(kù)都有自己的過(guò)期分區(qū),里邊存儲(chǔ)就是數(shù)據(jù)地址  和  數(shù)據(jù)過(guò)期時(shí)間。

Redis刪除策略和逐出策略是什么實(shí)現(xiàn)方式

redis在啟動(dòng)時(shí),會(huì)取讀取server下的hz的值,默認(rèn)為10。這個(gè)值直接在終端使用info server就可以查看的到

Redis刪除策略和逐出策略是什么然后會(huì)每秒鐘執(zhí)行server下hz次  進(jìn)行serverCron()輪詢

繼續(xù)使用databasesCron對(duì)redis的16個(gè)庫(kù)進(jìn)行挨個(gè)訪問(wèn)信息

訪問(wèn)時(shí)候會(huì)再執(zhí)行activeExpireCycel對(duì)每個(gè)expires[*]逐一進(jìn)行檢測(cè),每個(gè)執(zhí)行的時(shí)間為250ms / server hz這個(gè)參數(shù)

在對(duì)每個(gè)expirs[*]逐一檢測(cè)時(shí),會(huì)隨機(jī)拿出ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC個(gè)可以進(jìn)行檢測(cè)

  • 如果key超時(shí),直接刪除key
  • 一輪中刪除的key數(shù)量>ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC*25%繼續(xù)循環(huán)該過(guò)程
  • 如果一輪中刪除的key數(shù)量<=ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC25% ,檢查下一個(gè)expires[]

那么現(xiàn)在問(wèn)題來(lái)了,我們的250ms / hz這個(gè)時(shí)間執(zhí)行完了,但是把expires的16個(gè)數(shù)據(jù)庫(kù)沒(méi)有循環(huán)完怎么辦呢!  下次來(lái)在循環(huán)那個(gè)庫(kù)呢!  其實(shí)這個(gè)值是有存的,就是current_db這個(gè)值。這個(gè)值會(huì)記錄activeExpireCycel 下次進(jìn)入那個(gè)expires[*]執(zhí)行Redis刪除策略和逐出策略是什么特點(diǎn)1:CPU使用沒(méi)有高峰值,檢測(cè)頻率自定義設(shè)置

特點(diǎn)2:內(nèi)存壓力不會(huì)很大, 長(zhǎng)時(shí)間占用的內(nèi)存會(huì)被持續(xù)的清理

逐出算法

在上文中我們說(shuō)了三種刪除策略,但是這三種策略都是相對(duì)于設(shè)置了有效期的key才會(huì)有效。

那現(xiàn)在我們的redis使用的內(nèi)存不足了,就會(huì)使用逐出策略來(lái)保證redis的正常使用。

redis在每次執(zhí)行命令前會(huì)調(diào)用freeMemorylfNeeded()檢測(cè)內(nèi)存是否充足,當(dāng)不充足時(shí)就會(huì)清理一些key,這種清除數(shù)據(jù)的策略稱為逐出策略。

redis最大可使用內(nèi)存的參數(shù)為:maxmemory  默認(rèn)為0   指的是占用物理內(nèi)存的比例   一般設(shè)置50%就可以了

每次選取待刪除key的個(gè)數(shù):maxmemory-samples

刪除策略:maxmemory-policy

「下面我們來(lái)著重說(shuō)明刪除策略」

  • 檢測(cè)易失數(shù)據(jù)(也就是我們?cè)O(shè)置了有效期,但是還沒(méi)有到期的數(shù)據(jù),就是上文expires[*])
    • volatile-lru:挑選最近少使用的數(shù)據(jù)
    • volatile-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)
    • volatile-ttl:挑選將要淘汰的數(shù)據(jù)
    • volatile-random:隨機(jī)選擇

接下來(lái)看一幅圖

  • 9s就是現(xiàn)在的時(shí)間

  • 距離9s最長(zhǎng)的一個(gè)key就是age

  • 使用次數(shù)最少的就是gender這個(gè)key

  • 如果按照volatile-lru就會(huì)把a(bǔ)ge刪除掉

  • 如果按照volatile-lfu就會(huì)把gender刪除掉Redis刪除策略和逐出策略是什么

  • 檢測(cè)全部數(shù)據(jù)

    • allkeys-lru:挑選最近少使用的數(shù)據(jù)
    • allkeys-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)
    • allkeys-random:全庫(kù)隨機(jī)刪除
  • 放棄數(shù)據(jù)驅(qū)逐

    • no-enviction  : 數(shù)據(jù)不會(huì)進(jìn)行任何的刪除,直到內(nèi)存用完,引發(fā)oom錯(cuò)誤。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Redis刪除策略和逐出策略是什么內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(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