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

主頁 > 知識庫 > Redis中鍵的過期刪除策略深入講解

Redis中鍵的過期刪除策略深入講解

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

如果一個鍵過期了,那么它什么時候會被刪除呢?

這個問題有三種可能的答案,它們分別代表了三種不同的刪除策略:

  • 定時刪除:在設置鍵的過期時間的同時,創建一個定時器( timer ). 讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
  • 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。
  • 定期刪除: 每隔一段時間,程序就對數據庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數據庫, 則由算法決定。

在這三種策略中,第一種和第三種為主動刪除策略, 而第二種則為被動刪除策略。

前言

使用Redis時我們可以使用EXPIRE或EXPIREAT命令給key設置過期刪除時間,結構體redisDb中的expires字典保存了所有key的過期時間,這個字典(dict)的key是一個指針,指向redis中的某個key對象,過期字典的value是一個保存過期時間的整數。

/* Redis database representation. There are multiple databases identified
 * by integers from 0 (the default database) up to the max configured
 * database. The database number is the 'id' field in the structure. */
typedef struct redisDb {
 dict *dict;     /* The keyspace for this DB */
 dict *expires;    /* 過期字典*/
 dict *blocking_keys;  /* Keys with clients waiting for data (BLPOP) */
 dict *ready_keys;   /* Blocked keys that received a PUSH */
 dict *watched_keys;   /* WATCHED keys for MULTI/EXEC CAS */
 struct evictionPoolEntry *eviction_pool; /* Eviction pool of keys */
 int id;      /* Database ID */
 long long avg_ttl;   /* Average TTL, just for stats */
} redisDb;

設置過期時間

不論是EXPIRE,EXPIREAT,還是PEXPIRE,PEXPIREAT,底層的具體實現是一樣的。在Redis的key空間中找到要設置過期時間的這個key,然后將這個entry(key的指針,過期時間)加入到過期字典中。

void setExpire(redisDb *db, robj *key, long long when) {
 dictEntry *kde, *de;

 /* Reuse the sds from the main dict in the expire dict */
 kde = dictFind(db->dict,key->ptr);
 redisAssertWithInfo(NULL,key,kde != NULL);
 de = dictReplaceRaw(db->expires,dictGetKey(kde));
 dictSetSignedIntegerVal(de,when);
}

過期刪除策略

如果一個key過期了,何時會被刪除呢?在Redis中有兩種過期刪除策略:(1)惰性過期刪除;(2)定期刪除。接下來具體看看。

惰性過期刪除

Redis在執行任何讀寫命令時都會先找到這個key,惰性刪除就作為一個切入點放在查找key之前,如果key過期了就刪除這個key。


robj *lookupKeyRead(redisDb *db, robj *key) {
 robj *val;

 expireIfNeeded(db,key); // 切入點
 val = lookupKey(db,key);
 if (val == NULL)
  server.stat_keyspace_misses++;
 else
  server.stat_keyspace_hits++;
 return val;
}

定期刪除

key的定期刪除會在Redis的周期性執行任務(serverCron,默認每100ms執行一次)中進行,而且是發生Redis的master節點,因為slave節點會通過主節點的DEL命令同步過來達到刪除key的目的。


依次遍歷每個db(默認配置數是16),針對每個db,每次循環隨機選擇20個(ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP)key判斷是否過期,如果一輪所選的key少于25%過期,則終止迭次,此外在迭代過程中如果超過了一定的時間限制則終止過期刪除這一過程。

for (j = 0; j  dbs_per_call; j++) {
 int expired;
 redisDb *db = server.db+(current_db % server.dbnum);

 /* Increment the DB now so we are sure if we run out of time
  * in the current DB we'll restart from the next. This allows to
  * distribute the time evenly across DBs. */
 current_db++;

 /* Continue to expire if at the end of the cycle more than 25%
  * of the keys were expired. */
 do {
  unsigned long num, slots;
  long long now, ttl_sum;
  int ttl_samples;

  /* 如果該db沒有設置過期key,則繼續看下個db*/
  if ((num = dictSize(db->expires)) == 0) {
   db->avg_ttl = 0;
   break;
  }
  slots = dictSlots(db->expires);
  now = mstime();

  /* When there are less than 1% filled slots getting random
   * keys is expensive, so stop here waiting for better times...
   * The dictionary will be resized asap. */
  if (num  slots > DICT_HT_INITIAL_SIZE 
   (num*100/slots  1)) break;

  /* The main collection cycle. Sample random keys among keys
   * with an expire set, checking for expired ones. */
  expired = 0;
  ttl_sum = 0;
  ttl_samples = 0;

  if (num > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP)
   num = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP;// 20

  while (num--) {
   dictEntry *de;
   long long ttl;

   if ((de = dictGetRandomKey(db->expires)) == NULL) break;
   ttl = dictGetSignedIntegerVal(de)-now;
   if (activeExpireCycleTryExpire(db,de,now)) expired++;
   if (ttl > 0) {
    /* We want the average TTL of keys yet not expired. */
    ttl_sum += ttl;
    ttl_samples++;
   }
  }

  /* Update the average TTL stats for this database. */
  if (ttl_samples) {
   long long avg_ttl = ttl_sum/ttl_samples;

   /* Do a simple running average with a few samples.
    * We just use the current estimate with a weight of 2%
    * and the previous estimate with a weight of 98%. */
   if (db->avg_ttl == 0) db->avg_ttl = avg_ttl;
   db->avg_ttl = (db->avg_ttl/50)*49 + (avg_ttl/50);
  }

  /* We can't block forever here even if there are many keys to
   * expire. So after a given amount of milliseconds return to the
   * caller waiting for the other active expire cycle. */
  iteration++;
  if ((iteration  0xf) == 0) { /* 每迭代16次檢查一次 */
   long long elapsed = ustime()-start;

   latencyAddSampleIfNeeded("expire-cycle",elapsed/1000);
   if (elapsed > timelimit) timelimit_exit = 1;
  }
 // 超過時間限制則退出
  if (timelimit_exit) return;
  /* 在當前db中,如果少于25%的key過期,則停止繼續刪除過期key */
 } while (expired > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4);
}

總結

惰性刪除:讀寫之前判斷key是否過期

定期刪除:定期抽樣key,判斷是否過期

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Redis的LRU機制介紹
  • Redis中的數據過期策略詳解
  • 淺談redis的maxmemory設置以及淘汰策略
  • 關于redis Key淘汰策略的實現方法
  • Redis中LRU淘汰策略的深入分析

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

巨人網絡通訊聲明:本文標題《Redis中鍵的過期刪除策略深入講解》,本文關鍵詞  Redis,中鍵,的,過期,刪除,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis中鍵的過期刪除策略深入講解》相關的同類信息!
  • 本頁收集關于Redis中鍵的過期刪除策略深入講解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美大片在线观看| 国产91色综合久久免费分享| 日韩精品午夜视频| 欧美在线啊v一区| 亚洲综合精品久久| 日本久久电影网| 亚洲成人动漫在线观看| 777色狠狠一区二区三区| 精品国产伦一区二区三区免费| 久久久精品日韩欧美| 精品在线一区二区三区| 欧美tk—视频vk| 国产一区二区网址| 国产精品视频一二| 色综合久久88色综合天天| 亚洲成人动漫在线免费观看| 欧美电影免费观看高清完整版在线 | 国产成人日日夜夜| 亚洲成人av一区二区| 色悠悠久久综合| 日本美女一区二区三区| 国产视频一区二区在线观看| 91麻豆视频网站| 日韩精品欧美精品| 91精品国产综合久久香蕉麻豆| 黑人巨大精品欧美一区| 亚洲特黄一级片| 日韩一区二区在线看| 国产成人免费9x9x人网站视频| 国产精品天美传媒沈樵| 欧美性受xxxx黑人xyx| 久久99九九99精品| 亚洲第一会所有码转帖| 国产夜色精品一区二区av| 国产成人午夜99999| 日本欧美大码aⅴ在线播放| 中文字幕精品一区二区三区精品| 欧美日产国产精品| 91丝袜呻吟高潮美腿白嫩在线观看| 青草国产精品久久久久久| 亚洲免费在线观看| 国产精品美女一区二区在线观看| 欧美精品久久天天躁| 在线精品视频一区二区| 懂色av一区二区三区免费观看| 美日韩一区二区三区| 天堂成人免费av电影一区| 亚洲综合视频在线观看| 中文成人综合网| 国产欧美精品一区| 日韩免费观看2025年上映的电影| 欧美三级一区二区| 国产99久久久国产精品潘金| 免费在线看一区| 日韩黄色免费电影| 欧美一区二区免费视频| 午夜激情久久久| 欧美mv日韩mv亚洲| 欧美日韩成人高清| 色婷婷一区二区| 色呦呦国产精品| 97久久超碰精品国产| 成人手机电影网| 成人av免费在线播放| 高清久久久久久| 成人短视频下载| www.亚洲人| 色呦呦日韩精品| 色噜噜狠狠色综合欧洲selulu| 99免费精品在线观看| 99久久亚洲一区二区三区青草| www.亚洲色图| 欧美亚洲一区三区| 欧美综合一区二区| 91麻豆精品国产| 久久免费午夜影院| 中文字幕在线播放不卡一区| 亚洲视频一区在线观看| 亚洲国产一区二区三区| 日本在线不卡视频| 九色|91porny| 大胆欧美人体老妇| 色婷婷av一区| 日韩一级片在线观看| 国产日韩三级在线| 亚洲一线二线三线久久久| 亚洲第一会所有码转帖| 国产一区二区在线视频| 成人午夜伦理影院| 欧美在线999| 日韩精品在线看片z| 国产精品日产欧美久久久久| 亚洲黄色在线视频| 老司机午夜精品| 成人福利视频网站| 7777精品伊人久久久大香线蕉超级流畅| 欧美一区二区成人| 亚洲日本丝袜连裤袜办公室| 麻豆传媒一区二区三区| 91丨porny丨中文| 精品99一区二区| 亚洲国产中文字幕| 高清久久久久久| 69堂成人精品免费视频| 综合激情成人伊人| 九九热在线视频观看这里只有精品 | 中文字幕亚洲欧美在线不卡| 亚洲国产一区视频| 国产99一区视频免费| 欧美一级理论性理论a| 亚洲婷婷综合色高清在线| 麻豆精品久久精品色综合| 播五月开心婷婷综合| 欧美变态口味重另类| 亚洲夂夂婷婷色拍ww47| 国产成人啪免费观看软件| 制服.丝袜.亚洲.另类.中文| 亚洲欧洲日韩女同| 国产一区二区三区在线观看免费视频| 成人综合婷婷国产精品久久| 欧美xxx久久| 日本亚洲欧美天堂免费| 成人免费毛片aaaaa**| 日韩免费在线观看| 一级女性全黄久久生活片免费| 国产成人免费在线视频| 亚洲精品在线免费播放| 樱桃国产成人精品视频| 不卡视频一二三四| 久久先锋影音av| 国产在线精品免费av| 欧美精品日韩一区| 亚洲mv在线观看| 在线视频一区二区免费| 亚洲欧美偷拍卡通变态| 懂色av一区二区夜夜嗨| 国产日产欧美精品一区二区三区| 麻豆精品视频在线观看视频| 欧美久久一区二区| 亚洲一区二区免费视频| 欧美日韩一级二级| 免费观看在线综合| 欧美哺乳videos| 国产一区999| 中文字幕日韩精品一区| 成人一区在线观看| 国产精品嫩草99a| av一区二区三区四区| 亚洲视频一区二区在线| 91国模大尺度私拍在线视频| 亚洲免费在线观看| 欧美日韩国产另类不卡| 亚洲制服丝袜一区| 日韩免费高清电影| 国产乱人伦偷精品视频不卡 | 欧美日韩精品综合在线| 亚洲欧洲日韩av| 久久久久久99久久久精品网站| av亚洲精华国产精华精| 久久久国产午夜精品| 国产资源在线一区| 久久久91精品国产一区二区精品| 国产在线播精品第三| 2021久久国产精品不只是精品| 精品一区免费av| 久久午夜羞羞影院免费观看| 国产麻豆精品在线观看| 国产午夜亚洲精品理论片色戒 | 久久精品日韩一区二区三区| 日本亚洲欧美天堂免费| 欧美日韩成人综合在线一区二区 | 国产suv精品一区二区6| 日韩你懂的在线播放| 视频一区中文字幕| 欧美久久一二三四区| 午夜伦理一区二区| 51午夜精品国产| 中文字幕一区二区三中文字幕| 久久精品国产77777蜜臀| 欧美一区二区三区男人的天堂| 免费在线观看日韩欧美| 国产亚洲欧洲997久久综合| 99久久久精品| 精品一二三四在线| 一区二区三区蜜桃| 精品国产乱码久久久久久夜甘婷婷 | 日本成人在线网站| 日韩视频一区在线观看| 狠狠色丁香久久婷婷综合_中| 亚洲婷婷在线视频| 精品国产免费久久 | 成人av午夜电影| 奇米色一区二区三区四区| 亚洲与欧洲av电影| 日本高清免费不卡视频| 免费亚洲电影在线| 尤物视频一区二区| 国产日韩欧美高清| 欧美一级片在线观看| 欧美性猛交一区二区三区精品|