欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis的過(guò)期鍵刪除策略原理說(shuō)明

 更新時(shí)間:2022年08月27日 09:40:09   作者:奔跑的海星  
這篇文章主要介紹了Redis的過(guò)期鍵刪除策略原理說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Redis服務(wù)器實(shí)際使用的是惰性刪除和定期刪除兩種策略:通過(guò)配合使用這兩種刪除策略,服務(wù)器可以很好地在合理使用CPU時(shí)間和避免浪費(fèi)內(nèi)存空間之間取得平衡。

惰性刪除

惰性刪除策略對(duì)CPU時(shí)間來(lái)說(shuō)是最友好的:程序只會(huì)在取出鍵時(shí)才對(duì)鍵進(jìn)行過(guò)期檢查,這可以保證刪除過(guò)期鍵的操作只會(huì)在非做不可的情況下進(jìn)行,并且刪除的目標(biāo)僅限于當(dāng)前處理的鍵,這個(gè)策略不會(huì)在刪除其他無(wú)關(guān)的過(guò)期鍵上花費(fèi)任何CPU時(shí)間。

惰性刪除策略的缺點(diǎn)是,它對(duì)內(nèi)存是最不友好的:如果一個(gè)鍵已經(jīng)過(guò)期,而這個(gè)鍵又仍然保留在數(shù)據(jù)庫(kù)中,那么只要這個(gè)過(guò)期鍵不被刪除,它所占用的內(nèi)存就不會(huì)釋放。

在使用惰性刪除策略時(shí),如果數(shù)據(jù)庫(kù)中有非常多的過(guò)期鍵,而這些過(guò)期鍵又恰好沒(méi)有被訪問(wèn)到的話,那么它們也許永遠(yuǎn)也不會(huì)被刪除(除非用戶手動(dòng)執(zhí)行FLUSHDB),我們甚至可以將這種情況看作是一種內(nèi)存泄漏——無(wú)用的垃圾數(shù)據(jù)占用了大量的內(nèi)存,而服務(wù)器卻不會(huì)自己去釋放它們,這對(duì)于運(yùn)行狀態(tài)非常依賴(lài)于內(nèi)存的Redis服務(wù)器來(lái)說(shuō),肯定不是一個(gè)好消息。

舉個(gè)例子,對(duì)于一些和時(shí)間有關(guān)的數(shù)據(jù),比如日志(log),在某個(gè)時(shí)間點(diǎn)之后,對(duì)它們的訪問(wèn)就會(huì)大大減少,甚至不再訪問(wèn),如果這類(lèi)過(guò)期數(shù)據(jù)大量地積壓在數(shù)據(jù)庫(kù)中,用戶以為服務(wù)器已經(jīng)自動(dòng)將它們刪除了,但實(shí)際上這些鍵仍然存在,而且鍵所占用的內(nèi)存也沒(méi)有釋放,那么造成的后果肯定是非常嚴(yán)重的。

定期刪除

從上面對(duì)惰性刪除的討論來(lái)看,這刪除方式在單一使用時(shí)有明顯的缺陷:

惰性刪除浪費(fèi)太多內(nèi)存,有內(nèi)存泄漏的危險(xiǎn)。定期刪除策略是前兩種策略的一種整合和折中:

定期刪除策略每隔一段時(shí)間執(zhí)行一次刪除過(guò)期鍵操作,并通過(guò)限制刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少刪除操作對(duì)CPU時(shí)間的影響。除此之外,通過(guò)定期刪除過(guò)期鍵,定期刪除策略有效地減少了因?yàn)檫^(guò)期鍵而帶來(lái)的內(nèi)存浪費(fèi)。定期刪除策略的難點(diǎn)是確定刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率:

如果刪除操作執(zhí)行得太頻繁,或者執(zhí)行的時(shí)間太長(zhǎng),定期刪除策略就會(huì)退化成定時(shí)刪除策略,以至于將CPU時(shí)間過(guò)多地消耗在刪除過(guò)期鍵上面。

如果刪除操作執(zhí)行得太少,或者執(zhí)行的時(shí)間太短,定期刪除策略又會(huì)和惰性刪除策略一樣,出現(xiàn)浪費(fèi)內(nèi)存的情況。因此,如果采用定期刪除策略的話,服務(wù)器必須根據(jù)情況,合理地設(shè)置刪除操作的執(zhí)行時(shí)長(zhǎng)和執(zhí)行頻率。

惰性刪除策略

過(guò)期鍵的惰性刪除策略由db.c/expireIfNeeded函數(shù)實(shí)現(xiàn),所有讀寫(xiě)數(shù)據(jù)庫(kù)的Redis命令在執(zhí)行之前都會(huì)調(diào)用expireIfNeeded函數(shù)對(duì)輸入鍵進(jìn)行檢查:

如果輸入鍵已經(jīng)過(guò)期,那么expireIfNeeded函數(shù)將輸入鍵從數(shù)據(jù)庫(kù)中刪除。

如果輸入鍵未過(guò)期,那么expireIfNeeded函數(shù)不做動(dòng)作。

expireIfNeeded函數(shù)就像一個(gè)過(guò)濾器,它可以在命令真正執(zhí)行之前,過(guò)濾掉過(guò)期的輸入鍵,從而避免命令接觸到過(guò)期鍵。

另外,因?yàn)槊總€(gè)被訪問(wèn)的鍵都可能因?yàn)檫^(guò)期而被expireIfNeeded函數(shù)刪除,所以每個(gè)命令的實(shí)現(xiàn)函數(shù)都必須能同時(shí)處理鍵存在以及鍵不存在這兩種情況:

當(dāng)鍵存在時(shí),命令按照鍵存在的情況執(zhí)行。

當(dāng)鍵不存在或者鍵因?yàn)檫^(guò)期而被expireIfNeeded函數(shù)刪除時(shí),命令按照鍵不存在的情況執(zhí)行。

定期刪除策略的實(shí)現(xiàn)

過(guò)期鍵的定期刪除策略由redis.c/activeExpireCycle函數(shù)實(shí)現(xiàn),每當(dāng)Redis的服務(wù)器周期性操作redis.c/serverCron函數(shù)執(zhí)行時(shí),activeExpireCycle函數(shù)就會(huì)被調(diào)用,它在規(guī)定的時(shí)間內(nèi),分多次遍歷服務(wù)器中的各個(gè)數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)的expires字典中隨機(jī)檢查一部分鍵的過(guò)期時(shí)間,并刪除其中的過(guò)期鍵。

整個(gè)過(guò)程可以用偽代碼描述如下

activeExpireCycle函數(shù)的工作模式可以總結(jié)如下:

函數(shù)每次運(yùn)行時(shí),都從一定數(shù)量的數(shù)據(jù)庫(kù)中取出一定數(shù)量的隨機(jī)鍵進(jìn)行檢查,并刪除其中的過(guò)期鍵。

全局變量current_db會(huì)記錄當(dāng)前activeExpireCycle函數(shù)檢查的進(jìn)度,并在下一次activeExpireCycle函數(shù)調(diào)用時(shí),接著上一次的進(jìn)度進(jìn)行處理。比如說(shuō),如果當(dāng)前activeExpireCycle函數(shù)在遍歷10號(hào)數(shù)據(jù)庫(kù)時(shí)返回了,那么下次activeExpireCycle函數(shù)執(zhí)行時(shí),將從11號(hào)數(shù)據(jù)庫(kù)開(kāi)始查找并刪除過(guò)期鍵。

隨著activeExpireCycle函數(shù)的不斷執(zhí)行,服務(wù)器中的所有數(shù)據(jù)庫(kù)都會(huì)被檢查一遍,這時(shí)函數(shù)將current_db變量重置為0,然后再次開(kāi)始新一輪的檢查工作。

當(dāng)服務(wù)器運(yùn)行在復(fù)制模式下時(shí),從服務(wù)器的過(guò)期鍵刪除動(dòng)作由主服務(wù)器控制:

主服務(wù)器在刪除一個(gè)過(guò)期鍵之后,會(huì)顯式地向所有從服務(wù)器發(fā)送一個(gè)DEL命令,告知從服務(wù)器刪除這個(gè)過(guò)期鍵。

從服務(wù)器在執(zhí)行客戶端發(fā)送的讀命令時(shí),即使碰到過(guò)期鍵也不會(huì)將過(guò)期鍵刪除,而是繼續(xù)像處理未過(guò)期的鍵一樣來(lái)處理過(guò)期鍵

從服務(wù)器只有在接到主服務(wù)器發(fā)來(lái)的DEL命令之后,才會(huì)刪除過(guò)期鍵。

通過(guò)由主服務(wù)器來(lái)控制從服務(wù)器統(tǒng)一地刪除過(guò)期鍵,可以保證主從服務(wù)器數(shù)據(jù)的一致性,也正是因?yàn)檫@個(gè)原因,當(dāng)一個(gè)過(guò)期鍵仍然存在于主服務(wù)器的數(shù)據(jù)庫(kù)時(shí),這個(gè)過(guò)期鍵在從服務(wù)器里的復(fù)制品也會(huì)繼續(xù)存在。舉個(gè)例子,有一對(duì)主從服務(wù)器,它們的數(shù)據(jù)庫(kù)中都保存著同樣的三個(gè)鍵message、xxx和yyy,其中message為過(guò)期鍵,如圖所示。

如果這時(shí)有客戶端向從服務(wù)器發(fā)送命令GET message,那么從服務(wù)器將發(fā)現(xiàn)message鍵已經(jīng)過(guò)期,但從服務(wù)器并不會(huì)刪除message鍵,而是繼續(xù)將message鍵的值返回給客戶端,就好像message鍵并沒(méi)有過(guò)期一樣

假設(shè)在此之后,有客戶端向主服務(wù)器發(fā)送命令GET message,那么主服務(wù)器將發(fā)現(xiàn)鍵message已經(jīng)過(guò)期:主服務(wù)器會(huì)刪除message鍵,向客戶端返回空回復(fù),并向從服務(wù)器發(fā)送DEL message命令

從服務(wù)器在接收到主服務(wù)器發(fā)來(lái)的DEL message命令之后,也會(huì)從數(shù)據(jù)庫(kù)中刪除message鍵,在這之后,主從服務(wù)器都不再保存過(guò)期鍵message了

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis優(yōu)惠券秒殺解決方案

    Redis優(yōu)惠券秒殺解決方案

    這篇文章主要介紹了Redis解決優(yōu)惠券秒殺應(yīng)用案例,本文先講了搶購(gòu)問(wèn)題,指出其中會(huì)出現(xiàn)的多線程問(wèn)題,提出解決方案采用悲觀鎖和樂(lè)觀鎖兩種方式進(jìn)行實(shí)現(xiàn),然后發(fā)現(xiàn)在搶購(gòu)過(guò)程中容易出現(xiàn)一人多單現(xiàn)象,需要的朋友可以參考下
    2022-12-12
  • redis 解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制

    redis 解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制

    本文主要介紹了redis 解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • redis?bitmap數(shù)據(jù)結(jié)構(gòu)之java對(duì)等操作詳解

    redis?bitmap數(shù)據(jù)結(jié)構(gòu)之java對(duì)等操作詳解

    bitmap是以其高性能出名。其基本原理是一位存儲(chǔ)一個(gè)標(biāo)識(shí),其他衍生知道咱就不說(shuō)了,而redis就是以這種原生格式存儲(chǔ)的,這篇文章主要介紹了redis?bitmap數(shù)據(jù)結(jié)構(gòu)之java對(duì)等操作,需要的朋友可以參考下
    2022-10-10
  • CentOS系統(tǒng)中Redis數(shù)據(jù)庫(kù)的安裝配置指南

    CentOS系統(tǒng)中Redis數(shù)據(jù)庫(kù)的安裝配置指南

    Redis是一個(gè)基于主存存儲(chǔ)的數(shù)據(jù)庫(kù),性能很強(qiáng),這里我們就來(lái)看一下CentOS系統(tǒng)中Redis數(shù)據(jù)庫(kù)的安裝配置指南,包括將Redis作為系統(tǒng)服務(wù)運(yùn)行的技巧等,需要的朋友可以參考下
    2016-06-06
  • Redis教程(八):事務(wù)詳解

    Redis教程(八):事務(wù)詳解

    這篇文章主要介紹了Redis教程(八):事務(wù)詳解,本文講解了,本文講解了事務(wù)概述、相關(guān)命令列表、命令使用示例、WATCH命令和基于CAS的樂(lè)觀鎖等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于Redis數(shù)據(jù)庫(kù)入門(mén)詳細(xì)介紹

    關(guān)于Redis數(shù)據(jù)庫(kù)入門(mén)詳細(xì)介紹

    大家好,本篇文章主要講的是關(guān)于Redis數(shù)據(jù)庫(kù)入門(mén)詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類(lèi)型)的配置步驟

    Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類(lèi)型)的配置步驟

    這篇文章主要介紹了Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類(lèi)型)詳細(xì)教程,配置步驟需要先下載redistimeseries.so 文件,文中介紹了啟動(dòng)失敗問(wèn)題排查,需要的朋友可以參考下
    2024-01-01
  • Redis請(qǐng)求處理的流程分析

    Redis請(qǐng)求處理的流程分析

    這篇文章主要介紹了Redis?是如何進(jìn)行請(qǐng)求處理,這篇文章介紹了整個(gè)?Redis?的請(qǐng)求處理模型到底是怎樣的。從注冊(cè)監(jiān)聽(tīng)?fd?事件到執(zhí)行命令,到最后將數(shù)據(jù)回寫(xiě)給客戶端都做了個(gè)大概的分析,需要的朋友可以參考下
    2022-07-07
  • 詳解如何清理Redis內(nèi)存碎片

    詳解如何清理Redis內(nèi)存碎片

    操作系統(tǒng)的剩余空間總量足夠,但申請(qǐng)一塊N字節(jié)連續(xù)地址的空間時(shí),剩余內(nèi)存空間中沒(méi)有大小為N字節(jié)的連續(xù)空間,那么這些剩余內(nèi)存空間中,小于N字節(jié)的連續(xù)內(nèi)存空間就是內(nèi)存碎片,本文詳細(xì)介紹了如何清理Redis內(nèi)存碎片,需要的朋友可以參考一下
    2023-04-04
  • redis數(shù)據(jù)傾斜處理方法

    redis數(shù)據(jù)傾斜處理方法

    我們?cè)谑褂肦edis分片集群時(shí),集群最好的狀態(tài)就是每個(gè)實(shí)例可以處理相同或相近比例的請(qǐng)求,但如果不是這樣,則會(huì)出現(xiàn)某些實(shí)例壓力特別大,而某些實(shí)例特別空閑的情況發(fā)生,本文就一起來(lái)看下這種情況是如何發(fā)生的以及如何處理
    2022-12-12

最新評(píng)論