日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redis的過期數(shù)據(jù)會(huì)被立馬刪除么?

先說結(jié)論:并不會(huì)立馬刪除。Redis 有兩種刪除過期數(shù)據(jù)的策略:

成都創(chuàng)新互聯(lián)公司成立十年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名與空間、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)公司通過對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

  • 定期選取部分?jǐn)?shù)據(jù)刪除。
  • 惰性刪除。

該命令在 Redis 2.4 版本,過期時(shí)間并不是很精確,它可能在零到一秒之間。

從 Redis 2.6 開始,過期錯(cuò)誤為 0 到 1 毫秒。

EXPIRE key seconds [ NX | XX | GT | LT] 指令可以將指定的 key 設(shè)置過期時(shí)間,如果沒有設(shè)置過期時(shí)間, key 將一直存在,除非我們明確將其刪除,比如執(zhí)行 DEL 指令。

所謂”狡兔死,走狗烹“,沒用了就干掉,跟 35 歲就“畢業(yè)”是一個(gè)道理。

好慌……

從 Redis 版本 7.0.0 開始:EXPIRE 添加了選項(xiàng):NX、XX和GT、LT 選項(xiàng)。

  • NX:當(dāng) key 沒有過期時(shí)才設(shè)置過期時(shí)間。
  • XX:只有 key 已過期的時(shí)候才設(shè)置過期時(shí)間。
  • GT:僅當(dāng)新的到期時(shí)間大于當(dāng)前到期時(shí)間時(shí)才設(shè)置過期時(shí)間。
  • LT:僅在新到期時(shí)間小于當(dāng)前到期時(shí)間才設(shè)置到過期時(shí)間。

過期與持久化

主從或者集群架構(gòu)中,兩臺(tái)機(jī)器的時(shí)鐘嚴(yán)重不同步,會(huì)有什么問題么?

key 過期信息是用 Unix 絕對(duì)時(shí)間戳表示的。

為了讓過期操作正常運(yùn)行,機(jī)器之間的時(shí)間必須保證穩(wěn)定同步,否則就會(huì)出現(xiàn)過期時(shí)間不準(zhǔn)的情況。

比如兩臺(tái)時(shí)鐘嚴(yán)重不同步的機(jī)器發(fā)生 RDB 傳輸, slave 的時(shí)間設(shè)置為未來的 2000 秒,假如在 master 的一個(gè) key 設(shè)置 1000 秒存活,當(dāng) Slave 加載 RDB 的時(shí)候 key 就會(huì)認(rèn)為該 key 過期(因?yàn)?slave 機(jī)器時(shí)間設(shè)置為未來的 2000 s),并不會(huì)等待 1000 s 才過期。

機(jī)器時(shí)鐘不同步導(dǎo)致過期混亂

惰性刪除

惰性刪除很簡單,就是當(dāng)有客戶端的請(qǐng)求查詢?cè)?key 的時(shí)候,檢查下 key 是否過期,如果過期,則刪除該 key。

比如當(dāng) Redis 收到客戶端的GET movie:小澤#瑪……利亞.rmvb 請(qǐng)求,就會(huì)先檢查 key = movie:小澤#瑪……利亞.rmvb 是否已經(jīng)過期,如果過期那就刪除。

刪除過期數(shù)據(jù)的主動(dòng)權(quán)交給了每次訪問請(qǐng)求。

該實(shí)現(xiàn)通過 expireIfNeeded函數(shù)實(shí)現(xiàn),源碼路徑:src/db.c。

int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) {
// key 沒有過期,return 0
if (!keyIsExpired(db,key)) return 0;
if (server.masterhost != NULL) {
if (server.current_client == server.master) return 0;
if (!force_delete_expired) return 1;
}
if (checkClientPauseTimeoutAndReturnIfPaused()) return 1;

/* Delete the key */
deleteExpiredKeyAndPropagate(db,key);
return 1;
}

定期刪除

僅僅靠客戶端訪問來判斷 key 是否過期才執(zhí)行刪除肯定不夠,因?yàn)橛械?key 過期了,但未來再也沒人訪問,這些數(shù)據(jù)要怎么刪除呢?

不能讓這些數(shù)據(jù)「占著茅坑不拉屎」。

所謂定期刪除,也就是 Redis 默認(rèn)每 1 秒運(yùn)行 10 次(每 100 ms 執(zhí)行一次),每次隨機(jī)抽取一些設(shè)置了過期時(shí)間的 key,檢查是否過期,如果發(fā)現(xiàn)過期了就直接刪除。

注意:并不是一次運(yùn)行就檢查所有的庫,所有的鍵,而是隨機(jī)檢查一定數(shù)量的鍵。

具體步驟如下:

定時(shí)刪除

  1. 從所有設(shè)置了過期時(shí)間的 key 集合中隨機(jī)選擇 20 個(gè) key。
  2. 刪除「步驟 1」發(fā)現(xiàn)的所有過期 key 數(shù)據(jù)。
  3. 「步驟 2 」結(jié)束,過期的 key 超過 25%,則繼續(xù)執(zhí)行「步驟 1」。

刪除的源碼 expire.c 的 activeExpireCycle 函數(shù)實(shí)現(xiàn)。

這也就意味著在任何時(shí)候,過期 key 的最大數(shù)量等于每秒最大寫入操作量除以 4。

為啥不檢查所有設(shè)置過期時(shí)間的 key?

你想呀,假設(shè) Redis 里存放了 100 w 個(gè) key,都設(shè)置了過期時(shí)間,每隔 100 毫秒就檢查 100 w 個(gè) key,CPU 全浪費(fèi)在檢查過期 key 上了,Redis 也就廢了。

注意了:不管是定時(shí)刪除,還是惰性刪除。當(dāng)數(shù)據(jù)刪除后,master 會(huì)生成刪除的指令記錄到 AOF 和 slave 節(jié)點(diǎn)。

碼哥,如果過期的數(shù)據(jù)太多,定時(shí)刪除無法刪除完全(每次刪除完過期的 key 還是超過 25%),同時(shí)這些 key 也再也不會(huì)被客戶端請(qǐng)求,也就是無法走惰性刪除,會(huì)怎樣?

會(huì)不會(huì)導(dǎo)致 Redis 內(nèi)存耗盡,怎么破?

這個(gè)問題問得好,答案是走內(nèi)存淘汰機(jī)制。

今天就到這里,說太多的話,大家容易在知識(shí)的海量里嗆死,保命要緊,至于內(nèi)存淘汰機(jī)制詳情,請(qǐng)看下回分解。


網(wǎng)頁標(biāo)題:Redis的過期數(shù)據(jù)會(huì)被立馬刪除么?
文章起源:http://www.dlmjj.cn/article/dpodheg.html