婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis 對過期數據的處理方法

Redis 對過期數據的處理方法

熱門標簽:b2b外呼系統 四川穩定外呼系統軟件 一個地圖標注多少錢 地圖標注工廠入駐 南京手機外呼系統廠家 廊坊外呼系統在哪買 高碑店市地圖標注app 400電話辦理的口碑 臺灣電銷

在 redis 中,對于已經過期的數據,Redis 采用兩種策略來處理這些數據,分別是惰性刪除和定期刪除

惰性刪除

惰性刪除不會去主動刪除數據,而是在訪問數據的時候,再檢查當前鍵值是否過期,如果過期則執行刪除并返回 null 給客戶端,如果沒有過期則返回正常信息給客戶端。

它的優點是簡單,不需要對過期的數據做額外的處理,只有在每次訪問的時候才會檢查鍵值是否過期,缺點是刪除過期鍵不及時,造成了一定的空間浪費。

源碼

robj *lookupKeyReadWithFlags(redisDb *db, robj *key, int flags) {
 robj *val;

 if (expireIfNeeded(db,key) == 1) {
  /* Key expired. If we are in the context of a master, expireIfNeeded()
   * returns 0 only when the key does not exist at all, so it's safe
   * to return NULL ASAP. */
  if (server.masterhost == NULL) {
   server.stat_keyspace_misses++;
   notifyKeyspaceEvent(NOTIFY_KEY_MISS, "keymiss", key, db->id);
   return NULL;
  }

  /* However if we are in the context of a slave, expireIfNeeded() will
   * not really try to expire the key, it only returns information
   * about the "logical" status of the key: key expiring is up to the
   * master in order to have a consistent view of master's data set.
   *
   * However, if the command caller is not the master, and as additional
   * safety measure, the command invoked is a read-only command, we can
   * safely return NULL here, and provide a more consistent behavior
   * to clients accessign expired values in a read-only fashion, that
   * will say the key as non existing.
   *
   * Notably this covers GETs when slaves are used to scale reads. */
  if (server.current_client 
   server.current_client != server.master 
   server.current_client->cmd 
   server.current_client->cmd->flags  CMD_READONLY)
  {
   server.stat_keyspace_misses++;
   notifyKeyspaceEvent(NOTIFY_KEY_MISS, "keymiss", key, db->id);
   return NULL;
  }
 }
 val = lookupKey(db,key,flags);
 if (val == NULL) {
  server.stat_keyspace_misses++;
  notifyKeyspaceEvent(NOTIFY_KEY_MISS, "keymiss", key, db->id);
 }
 else
  server.stat_keyspace_hits++;
 return val;
}

定期刪除

定期刪除:Redis會周期性的隨機測試一批設置了過期時間的key并進行處理。測試到的已過期的key將被刪除。

具體的算法如下:

  • Redis配置項hz定義了serverCron任務的執行周期,默認為10,代表了每秒執行10次;
  • 每次過期key清理的時間不超過CPU時間的25%,比如hz默認為10,則一次清理時間最大為25ms;
  • 清理時依次遍歷所有的db;
  • 從db中隨機取20個key,判斷是否過期,若過期,則逐出;
  • 若有5個以上key過期,則重復步驟4,否則遍歷下一個db;
  • 在清理過程中,若達到了25%CPU時間,退出清理過程;

雖然redis的確是不斷的刪除一些過期數據,但是很多沒有設置過期時間的數據也會越來越多,那么redis內存不夠用的時候是怎么處理的呢?這里我們就會談到淘汰策略

Redis內存淘汰策略

當redis的內存超過最大允許的內存之后,Redis會觸發內存淘汰策略,刪除一些不常用的數據,以保證redis服務器的正常運行

在redis 4.0以前,redis的內存淘汰策略有以下6種

  • noeviction:當內存使用超過配置的時候會返回錯誤,不會驅逐任何鍵
  • allkeys-lru:加入鍵的時候,如果過限,首先通過LRU算法驅逐最久沒有使用的鍵
  • volatile-lru:加入鍵的時候如果過限,首先從設置了過期時間的鍵集合中驅逐最久沒有使用的鍵
  • allkeys-random:加入鍵的時候如果過限,從所有key隨機刪除
  • volatile-random:加入鍵的時候如果過限,從過期鍵的集合中隨機驅逐
  • volatile-ttl:從配置了過期時間的鍵中驅逐馬上就要過期的鍵
  • 在redis 4.0以后,又增加了以下兩種
  • volatile-lfu:從所有配置了過期時間的鍵中驅逐使用頻率最少的鍵
  • allkeys-lfu:從所有鍵中驅逐使用頻率最少的鍵

內存淘汰策略可以通過配置文件來修改,redis.conf對應的配置項是maxmemory-policy 修改對應的值就行,默認是noeviction

LRU(the least recently used 最近最少使用)算法

如果一個數據在最近沒有被訪問到,那么在未來被訪問的可能性也很小,因此當空間滿的時候,最久沒有被訪問的數據最先被置換(淘汰)

LRU算法通常通過雙向鏈表來實現,添加元素的時候,直接插入表頭,訪問元素的時候,先判斷元素是否在鏈表中存在,如果存在就把該元素移動至表頭,所以鏈表的元素排列順序就是元素最近被訪問的順序,當內存達到設置閾值時,LRU隊尾的元素由于被訪問的時間線較遠,會優先踢出

但是在redis中,并沒有嚴格實行LRU算法,之所以這樣是因為LRU需要消耗大量的額外內存,需要對現有的數據結構進行較大的改造,近似LRU算法采用在現有數據結構的基礎上使用隨機采樣法來淘汰元素,能達到和LRU算法非常近似的效果。Redis的 LRU算法給每個key增加了一個額外的長度為24bit的小字段,記錄最后一次被訪問的時間戳。

redis通過maxmemory-samples 5配置,對key進行采樣淘汰。同時在Redis3.0以后添加了淘汰池進一步提升了淘汰準確度。

但是LRU算法是存在一定的問題

例如,這表示隨著時間的推移,四個不同的鍵訪問。每個“〜”字符為一秒鐘,而“ |” 最后一行是當前時刻。

~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B ~~ B〜|

~~~~~~~~~~ C ~~~~~~~~ C ~~~~~~~~~ C ~~~~~~ |

~~~~~ D ~~~~~~~~~ D ~~~~~~~ D ~~~~~~~~ D |


在上圖中,按照LRU機制刪除的話刪除的順序應該是C->A->B->D 其實這并不是我們想要的,因為B被訪問的頻率是最高的,而D被訪問的頻率比較低,所以我們更想讓B保留,把D刪除,所以我們接下來看另一種策略 LFU

**LFU(leastFrequently used 最不經常使用)**

如果一個數據在最近一段時間內很少被訪問到,那么可以認為在將來他被訪問到的概率也很小。所以,當空間滿時,最小頻率訪問的數據最先被淘汰

Redis使用redisObject中的24bit lru字段來存儲lfu字段, 這24bit被分為兩部分:

1:高16位用來記錄訪問時間(單位為分鐘) 

2:低8位用來記錄訪問頻率,簡稱counter

 16 bits  8 bits
 
 +----------------+--------+
 
 Last decr time | LOG_C |

但是counter 8bit很容易就溢出了,技巧是用一個邏輯計數器,給予概率的對數計數器,而不是一個普通的遞增計數器
```
uint8_t LFULogIncr(uint8_t counter) {
 if (counter == 255) return 255;
 double r = (double)rand()/RAND_MAX;
 double baseval = counter - LFU_INIT_VAL;
 if (baseval  0) baseval = 0;
 double p = 1.0/(baseval*server.lfu_log_factor+1);
 if (r  p) counter++;
 return counter;
}
```

對應的概率分布計算公式為
```
1.0/((counter - LFU_INIT_VAL)*server.lfu_log_factor+1);
```
其中LFU_INIT_VAL為5,其實簡單說就是,越大的數,遞增的概率越低
嚴格按照LFU算法,時間越久的key,counter越有可能越大,被剔除的可能性就越小。counter只增長不衰減就無法區分熱點key。為了解決這個問題,redis提供了衰減因子server.lfu_decay_time,其單位為分鐘,計算方法也很簡單,如果一個key長時間沒有訪問那么他的計數器counter就要減少,減少的值由衰減因子來控制

到此這篇關于Redis 對過期數據的處理方法的文章就介紹到這了,更多相關Redis過期數據的處理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis中的數據過期策略詳解
  • Redis數據導入導出以及數據遷移的4種方法詳解
  • lua讀取redis數據的null判斷示例代碼

標簽:畢節 伊春 定州 泰州 甘南 拉薩 南寧 河源

巨人網絡通訊聲明:本文標題《Redis 對過期數據的處理方法》,本文關鍵詞  Redis,對,過期,數據,的,處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis 對過期數據的處理方法》相關的同類信息!
  • 本頁收集關于Redis 對過期數據的處理方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    玉足女爽爽91| 国产欧美一区二区精品性色超碰| 亚洲v日本v欧美v久久精品| 2020日本不卡一区二区视频| 日本久久精品电影| 成人午夜短视频| 麻豆精品久久久| 亚洲福利视频导航| 亚洲黄色性网站| 亚洲同性同志一二三专区| 亚洲国产精品激情在线观看| 久久综合九色综合97_久久久| 日韩精品自拍偷拍| 欧美mv日韩mv| 精品女同一区二区| 日韩一级高清毛片| 东方欧美亚洲色图在线| 色综合天天做天天爱| 国产精品一区三区| 激情都市一区二区| 国产在线精品一区二区| 九九国产精品视频| 国产欧美1区2区3区| 五月天精品一区二区三区| 中文字幕在线不卡视频| 国产丝袜在线精品| 国产精品麻豆一区二区| 国产精品人人做人人爽人人添 | 国产精品66部| 精品一区二区成人精品| 精品中文字幕一区二区小辣椒| 美国三级日本三级久久99| 欧美日韩三级一区| 欧美三级电影网站| 91黄色小视频| 91成人免费网站| 五月激情六月综合| 美国欧美日韩国产在线播放| 国产一区二区三区在线观看精品 | 91精品国产综合久久国产大片| 在线免费不卡电影| 日韩一级完整毛片| 国产清纯白嫩初高生在线观看91 | 亚洲精品视频一区| 亚洲欧美在线高清| 精品视频在线免费看| 日韩欧美在线网站| 欧美吻胸吃奶大尺度电影| 欧美三电影在线| 日韩免费高清av| 国产日产欧产精品推荐色| 综合精品久久久| 奇米精品一区二区三区在线观看一| 久久精品国产亚洲a| 国产成人精品免费看| 91蜜桃在线免费视频| 欧美一区二区视频在线观看2022| 亚洲国产精品精华液ab| 婷婷激情综合网| 97久久人人超碰| 欧美白人最猛性xxxxx69交| 18欧美亚洲精品| 国产一区二区三区电影在线观看| 色女孩综合影院| 精品卡一卡二卡三卡四在线| 日韩精品在线一区| 黄页视频在线91| av在线这里只有精品| 欧美日韩国产乱码电影| 国产欧美视频一区二区三区| 天堂成人国产精品一区| 成人av免费观看| 精品久久久久av影院| 一区二区三区四区视频精品免费| 国产一区 二区 三区一级| 欧美三级电影一区| 亚洲精品伦理在线| av电影一区二区| 国产三级精品视频| 奇米影视在线99精品| 欧美日韩中文字幕一区| 伊人色综合久久天天人手人婷| 丁香天五香天堂综合| 日韩精品影音先锋| 日韩电影在线免费看| 欧美三级午夜理伦三级中视频| 亚洲日本在线天堂| 一本久道中文字幕精品亚洲嫩| 欧美激情在线一区二区| 国产精品一区三区| 久久久久国产免费免费 | 欧美中文字幕一区| 自拍偷拍亚洲激情| 91在线免费视频观看| 中文字幕五月欧美| www.性欧美| 国产日韩影视精品| 成熟亚洲日本毛茸茸凸凹| 久久精品无码一区二区三区| 久久99精品久久久久久久久久久久| 欧美日韩国产一区二区三区地区| 尤物av一区二区| 欧美优质美女网站| 五月婷婷激情综合网| 欧美一区二区三区免费观看视频| 视频在线观看一区| 日韩精品中文字幕一区| 国产精品99久久不卡二区| 国产免费久久精品| 99久久综合国产精品| 亚洲免费观看高清完整版在线观看 | 亚洲乱码一区二区三区在线观看| 不卡的看片网站| 亚洲少妇30p| 成人av资源网站| 亚洲图片激情小说| 日本女优在线视频一区二区| 欧美性大战xxxxx久久久| 午夜视频一区在线观看| 日韩欧美在线观看一区二区三区| 精品在线一区二区| 久久久美女毛片| 波多野结衣视频一区| 亚洲人成精品久久久久| 欧美日韩中文另类| 久草精品在线观看| 国产嫩草影院久久久久| 欧美日韩一二三| 国产乱码一区二区三区| 国产精品丝袜在线| 91久久久免费一区二区| 五月开心婷婷久久| 国产欧美一区二区三区沐欲| 欧美日韩激情一区二区三区| 国产一区二区伦理片| 国产午夜精品在线观看| 高清在线成人网| 亚洲成人综合在线| 欧美精品一区二区蜜臀亚洲| av在线不卡电影| 日韩va欧美va亚洲va久久| 国产色综合久久| 欧美三级电影精品| 成人永久看片免费视频天堂| 欧美一区二区视频免费观看| av福利精品导航| 蜜桃一区二区三区在线| 国产精品国产成人国产三级 | 国产日韩欧美精品综合| 8x福利精品第一导航| 成人av手机在线观看| 裸体在线国模精品偷拍| 亚洲乱码国产乱码精品精可以看| 精品va天堂亚洲国产| 欧美系列一区二区| 99久久精品久久久久久清纯| 国产主播一区二区三区| 亚洲一区二区精品3399| 国产精品色婷婷久久58| 欧美成人性福生活免费看| 欧美性受xxxx| 色婷婷av一区二区三区之一色屋| 成人免费毛片嘿嘿连载视频| 久久精品国产77777蜜臀| 亚洲国产精品自拍| 国产精品国产三级国产aⅴ原创| 欧美zozo另类异族| 欧美一区二区三区白人| 欧美撒尿777hd撒尿| 91久久线看在观草草青青| 成人av免费在线播放| 国产精品中文字幕日韩精品 | 国产剧情一区在线| 精品一区在线看| 久久99热这里只有精品| 日韩av不卡在线观看| 日韩电影免费在线看| 久久国产人妖系列| 看片的网站亚洲| 欧美日韩一区不卡| 久久精品国产秦先生| 波多野结衣精品在线| 欧美性淫爽ww久久久久无| 国产精品一级片| 国产成人一区在线| 国产一区二区三区久久悠悠色av| 免费高清成人在线| 精品一区二区三区不卡| 蜜臀精品久久久久久蜜臀| 美女视频一区在线观看| 国产一区二区三区av电影| 国产精品原创巨作av| 成人动漫视频在线| 精品一区二区三区在线播放| 久久精品国产亚洲一区二区三区| 蓝色福利精品导航| 成人免费毛片aaaaa**| 色呦呦国产精品| 91.com在线观看| 久久久99精品免费观看|