亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

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

2020-03-17 12:32:50
字體:
來源:轉載
供稿:網友

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

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

  • 定時刪除:在設置鍵的過期時間的同時,創建一個定時器( 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);}

Redis,鍵,過期刪除,策略

過期刪除策略

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

惰性過期刪除

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

Redis,鍵,過期刪除,策略

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的目的。

Redis,鍵,過期刪除,策略

依次遍歷每個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,判斷是否過期

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


注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区久久久| 久久久久久久久电影| 亚洲影院高清在线| 97精品视频在线播放| 尤物九九久久国产精品的特点| 最近2019年日本中文免费字幕| 欧美在线观看日本一区| 精品精品国产国产自在线| 欧美精品成人在线| 亚洲精品一区二区在线| 国产精品永久免费| 久久在精品线影院精品国产| 九九九久久久久久| 国产97免费视| 亚洲欧美日韩网| 国产欧美日韩中文字幕| 日韩国产欧美精品在线| 亚洲精品一区二三区不卡| 91精品视频观看| 成人xxxxx| 日韩国产一区三区| 日韩色av导航| 亚洲欧美日韩精品久久奇米色影视| 精品国产91乱高清在线观看| 国产精品久久久久久中文字| 久久精品国产久精国产一老狼| 91久久精品国产91性色| 中文字幕亚洲精品| 成人免费观看49www在线观看| 91精品久久久久久久久久久久久久| 亚洲图片欧洲图片av| 久久成人亚洲精品| 日韩美女免费线视频| 欧美激情精品久久久久久久变态| 色综合视频一区中文字幕| 夜夜躁日日躁狠狠久久88av| 欧洲成人在线视频| 国模gogo一区二区大胆私拍| 欧美国产日韩在线| 欧美日韩一区免费| 韩剧1988免费观看全集| 成人国产精品一区| 久久久免费电影| 在线性视频日韩欧美| 国产一区二区三区在线免费观看| 色狠狠av一区二区三区香蕉蜜桃| 最近日韩中文字幕中文| 欧美体内谢she精2性欧美| 日韩国产一区三区| 亚洲精品美女在线| 国内外成人免费激情在线视频网站| 精品美女国产在线| 久久影院在线观看| 岛国精品视频在线播放| 91地址最新发布| 欧美三级欧美成人高清www| 狠狠躁18三区二区一区| 亚洲欧洲高清在线| 亚洲精品久久视频| 精品久久久久久久久久久久久久| 亚洲精品欧美极品| 欧美激情2020午夜免费观看| 欧美裸体视频网站| 精品久久香蕉国产线看观看亚洲| 国产精品精品一区二区三区午夜版| 亚洲第一视频在线观看| 国产欧美一区二区三区久久| 97精品国产97久久久久久免费| 欧美壮男野外gaytube| 亚洲影院高清在线| 国产日韩欧美在线看| 亚洲激情视频网| 一区二区日韩精品| 亚洲日韩欧美视频| 精品福利在线视频| 日本中文字幕不卡免费| 日韩经典第一页| 91精品久久久久| 亚洲精品永久免费| 国产日韩在线亚洲字幕中文| …久久精品99久久香蕉国产| 国产精品久久电影观看| 97精品国产91久久久久久| 中文字幕国内精品| 亚洲第一区在线| 亚洲欧美日韩视频一区| 亚洲欧美中文日韩在线v日本| www.日本久久久久com.| 亚洲小视频在线观看| 这里精品视频免费| 国产精品久久久久91| 色中色综合影院手机版在线观看| 久久精品这里热有精品| 国产欧美婷婷中文| 亚洲香蕉成人av网站在线观看| 77777少妇光屁股久久一区| 日本一区二区不卡| 91久久久久久久一区二区| 68精品国产免费久久久久久婷婷| 欧美成人亚洲成人日韩成人| 久久中文字幕在线| 国产精品免费一区豆花| 国产精品一区二区久久| 欧美人与物videos| 久久婷婷国产麻豆91天堂| 国产精品吴梦梦| 人人澡人人澡人人看欧美| 国产精品日韩精品| 美乳少妇欧美精品| 在线观看中文字幕亚洲| 97久久久免费福利网址| 日韩欧美aaa| 国产97在线|日韩| 久久亚洲一区二区三区四区五区高| 欧美人与物videos| 亚洲国产精品网站| 91社影院在线观看| 国产精品视频不卡| 欧美日韩亚洲网| 福利视频一区二区| 日本久久久久亚洲中字幕| yellow中文字幕久久| 成人激情视频网| 45www国产精品网站| 精品久久中文字幕久久av| 影音先锋欧美精品| 国产精品一区二区av影院萌芽| 国产精品女主播视频| 欧美精品电影免费在线观看| 国产精品网站视频| 国产精品99蜜臀久久不卡二区| 国产精品美乳一区二区免费| 九九精品在线播放| 午夜精品99久久免费| 91热精品视频| 欧美www视频在线观看| 国产精品丝袜视频| 精品久久久999| 久久久国产91| 亚洲精品aⅴ中文字幕乱码| 97超碰国产精品女人人人爽| 国产精品视频999| 亚洲第一网中文字幕| 91美女片黄在线观| 国产精品视频精品| 亚洲激情视频在线| 亚洲国产成人一区| 在线观看亚洲视频| 萌白酱国产一区二区| 成人性生交大片免费看小说| 欧美激情精品久久久久久黑人| 亚洲成人网在线观看| 欧美超级免费视 在线| 亚洲欧洲成视频免费观看| 亚洲另类欧美自拍| 成人在线小视频| 亚洲欧美福利视频| 国产精品视频xxxx| 国产精品视频成人| 国产精品视频免费在线观看| 亚洲女人天堂色在线7777| 日韩在线激情视频| 日韩亚洲精品电影| 久久久亚洲天堂|