Redis過(guò)期鍵刪除策略解讀
1.Redis使用兩種不同的策略來(lái)刪除過(guò)期鍵,分別是惰性刪除策略和定期刪除策略
1.1惰性刪除策略
當(dāng)一個(gè)過(guò)期鍵被訪(fǎng)問(wèn)時(shí),Redis會(huì)檢查這個(gè)鍵是否過(guò)期。如果過(guò)期,就會(huì)立即刪除。如果沒(méi)有過(guò)期,Redis會(huì)像處理普通鍵一樣繼續(xù)處理它。這種方式被稱(chēng)為惰性刪除,因?yàn)镽edis只會(huì)在需要訪(fǎng)問(wèn)一個(gè)鍵時(shí)才會(huì)檢查它是否過(guò)期,并在發(fā)現(xiàn)它過(guò)期后刪除它。這種策略的好處是能夠節(jié)省刪除鍵所帶來(lái)的 CPU 開(kāi)銷(xiāo),因?yàn)?Redis 只有在有需要時(shí)才會(huì)刪除鍵
1.2定期刪除策略
Redis也使用一種定期刪除策略來(lái)刪除過(guò)期鍵。在這種策略下,Redis會(huì)每隔一段時(shí)間掃描數(shù)據(jù)庫(kù),查找所有已過(guò)期的鍵并將它們刪除。這種方式稱(chēng)為定期刪除,因?yàn)镽edis會(huì)定期執(zhí)行這個(gè)操作。這種策略的好處是能夠保證 Redis 數(shù)據(jù)庫(kù)中過(guò)期的鍵能夠及時(shí)被刪除,從而避免浪費(fèi)空間。
1.3策略小結(jié)
Redis 的默認(rèn)配置是同時(shí)使用惰性刪除和定期刪除兩種策略。當(dāng) Redis 同時(shí)使用這兩種策略時(shí),惰性刪除策略能夠節(jié)省 CPU 開(kāi)銷(xiāo),定期刪除策略能夠保證過(guò)期鍵及時(shí)被刪除。
在一些特殊情況下,我們可能需要調(diào)整 Redis 的刪除策略,比如對(duì)于一些不太重要的數(shù)據(jù),我們可以只使用惰性刪除策略來(lái)降低 Redis 的 CPU 開(kāi)銷(xiāo),對(duì)于一些比較重要的數(shù)據(jù),我們可以只使用定期刪除策略來(lái)保證數(shù)據(jù)的正確性。這些調(diào)整可以通過(guò) Redis 的配置參數(shù)來(lái)實(shí)現(xiàn)。
惰性刪除策略可以讓Redis更高效地使用內(nèi)存,因?yàn)樗挥性谛枰L(fǎng)問(wèn)一個(gè)鍵時(shí)才會(huì)檢查它是否過(guò)期。但是,它可能會(huì)導(dǎo)致過(guò)期鍵長(zhǎng)時(shí)間滯留在內(nèi)存中,直到下次被訪(fǎng)問(wèn)。定期刪除策略則可以保證過(guò)期鍵及時(shí)被刪除,但可能會(huì)對(duì)性能產(chǎn)生一定的影響,因?yàn)樗枰芷谛缘乇闅v整個(gè)數(shù)據(jù)庫(kù)。為了平衡內(nèi)存使用和性能,Redis通常會(huì)同時(shí)使用這兩種策略。
2.惰性刪除策略與定期刪除策略的使用
Redis 的惰性刪除策略和定期刪除策略默認(rèn)都是開(kāi)啟的,所以在通常情況下,我們不需要做任何特殊的配置即可使用這兩種策略。
如果你想要對(duì) Redis 的刪除策略進(jìn)行調(diào)整,可以通過(guò)以下方式進(jìn)行配置:
惰性刪除策略
Redis 的惰性刪除策略是默認(rèn)開(kāi)啟的,如果你想要關(guān)閉惰性刪除,可以在 Redis 的配置文件中將以下參數(shù)設(shè)置為 no:
# 是否啟用惰性刪除 # 如果設(shè)置為 no,則 Redis 將不使用惰性刪除策略 # 默認(rèn)為 yes lazyfree-lazy-eviction no
定期刪除策略
Redis 的定期刪除策略是通過(guò)一個(gè)配置參數(shù)來(lái)控制的,這個(gè)參數(shù)默認(rèn)值為 10 秒鐘,即 Redis 每隔 10 秒鐘會(huì)檢查一次過(guò)期鍵并刪除過(guò)期鍵。如果你想要改變這個(gè)值,可以在 Redis 的配置文件中修改以下參數(shù):
# 設(shè)置 Redis 定期刪除策略的周期 # 默認(rèn)為 10 秒鐘 # 單位為秒 hz 100
在上面的配置中,我們將 Redis 定期刪除策略的周期設(shè)置為 100 秒,即 Redis 每隔 100 秒鐘會(huì)檢查一次過(guò)期鍵并刪除過(guò)期鍵。
需要注意的是,當(dāng) Redis 同時(shí)使用惰性刪除和定期刪除兩種策略時(shí),惰性刪除策略會(huì)優(yōu)先執(zhí)行,即 Redis 只有在有客戶(hù)端請(qǐng)求鍵時(shí)才會(huì)檢查鍵是否過(guò)期,定期刪除策略只有在惰性刪除策略無(wú)法滿(mǎn)足時(shí)才會(huì)起作用。
3.為什么Redis中會(huì)導(dǎo)致讀取到過(guò)期數(shù)據(jù)
雖然定期刪除策略可以釋放一些內(nèi)存,但是,Redis 為了避免過(guò)多刪除操作對(duì)性能產(chǎn)生影響,每次隨機(jī)檢查數(shù)據(jù)的數(shù)量并不多。如果過(guò)期數(shù)據(jù)很多,并且一直沒(méi)有再被訪(fǎng)問(wèn)的話(huà),這些數(shù)據(jù)就會(huì)留存在 Redis 實(shí)例中。業(yè)務(wù)應(yīng)用之所以會(huì)讀到過(guò)期數(shù)據(jù),這些留存數(shù)據(jù)就是一個(gè)重要因素。
惰性刪除策略實(shí)現(xiàn)后,數(shù)據(jù)只有被再次訪(fǎng)問(wèn)時(shí),才會(huì)被實(shí)際刪除。如果客戶(hù)端從主庫(kù)上讀取留存的過(guò)期數(shù)據(jù),主庫(kù)會(huì)觸發(fā)刪除操作,此時(shí),客戶(hù)端并不會(huì)讀到過(guò)期數(shù)據(jù)。但是,從庫(kù)本身不會(huì)執(zhí)行刪除操作,如果客戶(hù)端在從庫(kù)中訪(fǎng)問(wèn)留存的過(guò)期數(shù)據(jù),從庫(kù)并不會(huì)觸發(fā)數(shù)據(jù)刪除。
4.從庫(kù)會(huì)給客戶(hù)端返回過(guò)期數(shù)據(jù)嗎?
Redis3.2版本之前,從庫(kù)會(huì)返回過(guò)期數(shù)據(jù)。Redis3.2之后從庫(kù)不會(huì)返回過(guò)期數(shù)據(jù),會(huì)返回空值,但是還是有可能會(huì)讀到。
如果使用的是 Redis 3.2 之前的版本,那么,從庫(kù)在服務(wù)讀請(qǐng)求時(shí),并不會(huì)判斷數(shù)據(jù)是否過(guò)期,而是會(huì)返回過(guò)期數(shù)據(jù)。在 3.2 版本后,Redis 做了改進(jìn),如果讀取的數(shù)據(jù)已經(jīng)過(guò)期了,從庫(kù)雖然不會(huì)刪除,但是會(huì)返回空值,這就避免了客戶(hù)端讀到過(guò)期數(shù)據(jù)。所以,在應(yīng)用主從集群時(shí),盡量使用 Redis 3.2 及以上版本。
使用了 Redis 3.2 后的版本,還是會(huì)讀到過(guò)期數(shù)據(jù),這跟 Redis 用于設(shè)置過(guò)期時(shí)間的命令有關(guān)系,有些命令給數(shù)據(jù)設(shè)置的過(guò)期時(shí)間在從庫(kù)上可能會(huì)被延后,導(dǎo)致應(yīng)該過(guò)期的數(shù)據(jù)又在從庫(kù)上被讀取到
4.1設(shè)置數(shù)據(jù)過(guò)期時(shí)間命令說(shuō)明
- EXPIRE 和 PEXPIRE:它們給數(shù)據(jù)設(shè)置的是從命令執(zhí)行時(shí)開(kāi)始計(jì)算的存活時(shí)間;
- EXPIREAT 和 PEXPIREAT:它們會(huì)直接把數(shù)據(jù)的過(guò)期時(shí)間設(shè)置為具體的一個(gè)時(shí)間點(diǎn)。
主從庫(kù)全量同步,收到EXPIRE命令,主庫(kù)直接執(zhí)行,全量同步完成發(fā)送給從庫(kù),從庫(kù)執(zhí)行的時(shí)候會(huì)在當(dāng)前時(shí)間基礎(chǔ)上加上存活時(shí)間,過(guò)期時(shí)間明顯延后。
為了避免這種情況,在業(yè)務(wù)應(yīng)用中使用 EXPIREAT/PEXPIREAT 命令,把數(shù)據(jù)的過(guò)期時(shí)間設(shè)置為具體的時(shí)間點(diǎn),避免讀到過(guò)期數(shù)據(jù)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Redis和Lua實(shí)現(xiàn)分布式限流器的方法詳解
這篇文章主要給大家介紹了關(guān)于Redis和Lua實(shí)現(xiàn)分布式限流器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis和Lua具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06淺談Redis中的內(nèi)存淘汰策略和過(guò)期鍵刪除策略
本文主要介紹了淺談Redis中的內(nèi)存淘汰策略和過(guò)期鍵刪除策略,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫(kù)的教程
這篇文章主要介紹了在CenOS系統(tǒng)下安裝和配置Redis數(shù)據(jù)庫(kù)的教程,Redis是一個(gè)可基于內(nèi)存的高性能NoSQL數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-11-11YII2框架手動(dòng)安裝Redis擴(kuò)展的過(guò)程
這篇文章主要介紹了YII2框架手動(dòng)安裝Redis擴(kuò)展的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Redis之RedisTemplate配置方式(序列和反序列化)
這篇文章主要介紹了Redis之RedisTemplate配置方式(序列和反序列化),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹
大家好,本篇文章主要講的是Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01redis通過(guò)位圖法記錄在線(xiàn)用戶(hù)的狀態(tài)詳解
這篇文章主要給大家介紹了關(guān)于redis如何通過(guò)位圖法記錄在線(xiàn)用戶(hù)的狀態(tài)的相關(guān)資料,文中先對(duì)位圖進(jìn)行了一個(gè)簡(jiǎn)單的介紹,而后通過(guò)示例代碼將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11