日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一篇帶你了解Redis刪除策略

Redis刪除策略

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)華坪,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220

過(guò)期數(shù)據(jù)在Redis中所有設(shè)置了TTL的數(shù)據(jù)可能不會(huì)立即刪除,Redis會(huì)將該鍵帶上過(guò)期時(shí)間存放到內(nèi)存中的一個(gè)Expires字典中。

當(dāng)執(zhí)行TTL命令后會(huì)返回其狀態(tài)

 
 
 
 
  1. redis 127.0.0.1:6379> TTL key 
  2.  
  3. -2: Key已經(jīng)過(guò)期、被刪除、未定義 
  4.  
  5. -1: 永久有效 
  6.  
  7. XX: XX為 key 的剩余生存時(shí)間,以秒為單位 

這里的已過(guò)期數(shù)據(jù),真的刪除了嗎?

數(shù)據(jù)刪除策略

前面說(shuō)到當(dāng)存儲(chǔ)一個(gè)key之后,這個(gè)key連同有效期被存儲(chǔ)到Expires字典中,具體什么時(shí)候刪除的呢?

通常刪除某個(gè)key,我們有如下三種處理方式:

  • 定時(shí)刪除
  • 惰性刪除
  • 定期刪除

1. 定時(shí)刪除

創(chuàng)建一個(gè)定時(shí)器,當(dāng)key設(shè)置有過(guò)期時(shí)間,且過(guò)期時(shí)間到達(dá)時(shí),由定時(shí)器任務(wù)立即執(zhí)行對(duì)鍵的刪除操作

優(yōu)點(diǎn):節(jié)省內(nèi)存,到時(shí)就刪除,快速釋放掉不必要的內(nèi)存空間

缺點(diǎn):CPU壓力大,無(wú)論此時(shí)CPU過(guò)載有多高,都會(huì)占用CPU,會(huì)影響Redis服務(wù)器的響應(yīng)時(shí)間和吞吐量

總結(jié):用處理器性能換取內(nèi)存空間(時(shí)間換空間)

2. 惰性刪除

數(shù)據(jù)到達(dá)過(guò)期時(shí)間后,不做處理。等下次訪(fǎng)問(wèn)時(shí),

  • 如果未過(guò)期,返回?cái)?shù)據(jù)
  • 如果已過(guò)期,刪除并返回不存在

優(yōu)點(diǎn):節(jié)約CPU性能,發(fā)現(xiàn)必須刪除時(shí)才刪除

缺點(diǎn):內(nèi)存壓力大,出現(xiàn)長(zhǎng)期占用內(nèi)存空間的數(shù)據(jù)

總結(jié):用內(nèi)存空間換取CPU處理性能(空間換時(shí)間)

3. 定期刪除

定時(shí)刪除和惰性刪除都太極端了,定期刪除就是一個(gè)比較好的折中方案

周期性的輪詢(xún)Redis庫(kù)中的時(shí)效性數(shù)據(jù),采用隨機(jī)抽取的策略,利用過(guò)期數(shù)據(jù)占比的方式控制刪除頻度

特點(diǎn):

  • CPU占用設(shè)置有峰值,檢測(cè)頻度可以自定義
  • 內(nèi)存壓力不是很大,長(zhǎng)期占用內(nèi)存的冷數(shù)據(jù)會(huì)被持續(xù)清理

總結(jié):周期性抽查存儲(chǔ)空間(隨機(jī)抽查,重點(diǎn)抽查)

定期刪除,Redis服務(wù)器啟動(dòng)初始化時(shí),讀取配置server.hz的值,默認(rèn)為10

每秒執(zhí)行server.hz次serverCorn()->databaseCorn()->activeExpireCycle()

其中activeExpireCycle()對(duì)每個(gè)Expires[*]逐一檢測(cè),每次執(zhí)行時(shí)間為250ms/server.hz

對(duì)某個(gè)Expires[*]檢測(cè)時(shí),隨機(jī)挑選幾個(gè)key檢測(cè):

  • 如果key超時(shí),刪除key
  • 如果一輪中刪除key的數(shù)量>W*25%,循環(huán)該過(guò)程(重點(diǎn)抽查)
  • 如果一輪中刪除key的數(shù)量
  • 其中W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP的屬性值

4. 刪除策略對(duì)比

逐出算法

1. 新數(shù)據(jù)進(jìn)入檢測(cè)

當(dāng)新數(shù)據(jù)進(jìn)入Redis時(shí),內(nèi)存不足怎么辦?

Redis使用內(nèi)存存儲(chǔ)數(shù)據(jù),在執(zhí)行每一個(gè)命令前,會(huì)調(diào)用freeMermoryIfNeeded()檢測(cè)內(nèi)存是否充足。如果內(nèi)存不滿(mǎn)足新加入的數(shù)據(jù)的最低存儲(chǔ)要求,Redis要臨時(shí)刪除一些數(shù)據(jù)為當(dāng)前指令清理存儲(chǔ)空間。清理數(shù)據(jù)的策略成為逐出算法(內(nèi)存淘汰策略)

注意:逐出數(shù)據(jù)的過(guò)程不是100%能夠清理出足夠的可使用的內(nèi)存空間,如果不成功會(huì)反復(fù)執(zhí)行。當(dāng)前所有數(shù)據(jù)嘗試執(zhí)行完畢后,如果不能達(dá)到內(nèi)存清理的要求,將出現(xiàn)錯(cuò)誤信息。

 
 
 
 
  1. (error) OOM command not allowed when used memory >'maxmemory' 

2. 逐出算法配置

  • 最大可用內(nèi)存
 
 
 
 
  1. maxmermory 
  2.  說(shuō)明:占用物理內(nèi)存的比例。默認(rèn)值是0,標(biāo)識(shí)不限制。生產(chǎn)上根據(jù)需要設(shè)置,一般在50%以上 
  • 每次選取待刪除的個(gè)數(shù)
 
 
 
 
  1. maxmermroy-samples 
  2.  說(shuō)明:選取待刪除的數(shù)據(jù)時(shí),如果掃描全庫(kù),會(huì)嚴(yán)重消耗性能,降低讀寫(xiě)性能。因?yàn)椴捎秒S機(jī)獲取數(shù)據(jù)的方式作為待檢測(cè)刪除數(shù)據(jù) 
  • 刪除策略
 
 
 
 
  1. maxmermory-policy 
  2.  說(shuō)明:達(dá)到最大內(nèi)存后,對(duì)被挑選出來(lái)的數(shù)據(jù)進(jìn)行刪除的策略 

3. 逐出算法

如果Redis配置了maxmemory和maxmemory-policy策略,則當(dāng)Redis內(nèi)存數(shù)據(jù)達(dá)到maxmemory時(shí),會(huì)根據(jù)maxmemory-policy配置來(lái)淘汰內(nèi)存數(shù)據(jù),以避免OOM。

根據(jù)maxmemory-policy的配置項(xiàng),執(zhí)行刪除策略時(shí)分為兩大類(lèi):易失數(shù)據(jù)(設(shè)置過(guò)期時(shí)間的數(shù)據(jù))、永久數(shù)據(jù)。Redis默認(rèn)值為volatile-lru.

檢測(cè)易失數(shù)據(jù)(會(huì)過(guò)期的數(shù)據(jù)集server.db[i].expries)

  • volatile-lru:挑選最近最少使用的數(shù)據(jù)淘汰
  • volatile-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
  • volatile-random:任意選擇數(shù)據(jù)淘汰
  • volatile-ttl:挑選即將過(guò)期的數(shù)據(jù)淘汰

檢測(cè)全庫(kù)數(shù)據(jù)(所有數(shù)據(jù)集server.db[i].dict)

  • allkeys-lru:挑選最近最少使用的數(shù)據(jù)淘汰
  • allkeys-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
  • allkeys-random:任意選擇數(shù)據(jù)淘汰

放棄數(shù)據(jù)淘汰

  • no-enviction:禁止數(shù)據(jù)淘汰,會(huì)引發(fā)OOM(Out Of Memroy)。Redis4.0默認(rèn)策略

LRU和LFU算法示例

4. 數(shù)據(jù)逐出策略配置依據(jù)

使用info命令數(shù)據(jù)監(jiān)控信息,查詢(xún)緩存hit和miss次數(shù),根據(jù)業(yè)務(wù)需要配置逐出算法。

本文轉(zhuǎn)載自微信公眾號(hào)「Java養(yǎng)基場(chǎng)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java養(yǎng)基場(chǎng)公眾號(hào)。


網(wǎng)站標(biāo)題:一篇帶你了解Redis刪除策略
文章鏈接:http://m.5511xx.com/article/dpedgcd.html