網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1. 常見的刪除策略
常見的刪除策略有以下3種:
- 定時(shí)刪除
在設(shè)置鍵的過(guò)期時(shí)間的同時(shí),創(chuàng)建一個(gè)定時(shí)器,讓定時(shí)器在鍵的過(guò)期時(shí)間來(lái)臨時(shí),立即執(zhí)行對(duì)鍵的刪除操作。
- 惰性刪除
放任過(guò)期鍵不管,每次從鍵空間中獲取鍵時(shí),檢查該鍵是否過(guò)期,如果過(guò)期,就刪除該鍵,如果沒有過(guò)期,就返回該鍵。
- 定期刪除
每隔一段時(shí)間,程序?qū)?shù)據(jù)庫(kù)進(jìn)行一次檢查,刪除里面的過(guò)期鍵,至于要?jiǎng)h除哪些數(shù)據(jù)庫(kù)的哪些過(guò)期鍵,則由算法決定。
其中定時(shí)刪除和定期刪除為主動(dòng)刪除策略,惰性刪除為被動(dòng)刪除策略。
1.1 定時(shí)刪除策略
定時(shí)刪除策略通過(guò)使用定時(shí)器,定時(shí)刪除策略可以保證過(guò)期鍵盡可能快地被刪除,并釋放過(guò)期鍵占用的內(nèi)存。
因此,定時(shí)刪除策略的優(yōu)缺點(diǎn)如下所示:
- 優(yōu)點(diǎn):對(duì)內(nèi)存非常友好
- 缺點(diǎn):對(duì)CPU時(shí)間非常不友好
舉個(gè)例子,如果有大量的命令請(qǐng)求等待服務(wù)器處理,并且服務(wù)器當(dāng)前不缺少內(nèi)存,如果服務(wù)器將大量的CPU時(shí)間用來(lái)刪除過(guò)期鍵,那么服務(wù)器的響應(yīng)時(shí)間和吞吐量就會(huì)受到影響。
也就是說(shuō),如果服務(wù)器創(chuàng)建大量的定時(shí)器,服務(wù)器處理命令請(qǐng)求的性能就會(huì)降低,因此Redis目前并沒有使用定時(shí)刪除策略。
1.2 惰性刪除策略
惰性刪除策略只會(huì)在獲取鍵時(shí)才對(duì)鍵進(jìn)行過(guò)期檢查,不會(huì)在刪除其它無(wú)關(guān)的過(guò)期鍵花費(fèi)過(guò)多的CPU時(shí)間。
因此,惰性刪除策略的優(yōu)缺點(diǎn)如下所示:
- 優(yōu)點(diǎn):對(duì)CPU時(shí)間非常友好
- 缺點(diǎn):對(duì)內(nèi)存非常不友好
舉個(gè)例子,如果數(shù)據(jù)庫(kù)有很多的過(guò)期鍵,而這些過(guò)期鍵又恰好一直沒有被訪問(wèn)到,那這些過(guò)期鍵就會(huì)一直占用著寶貴的內(nèi)存資源,造成資源浪費(fèi)。
1.3 定期刪除策略
定期刪除策略是定時(shí)刪除策略和惰性刪除策略的一種整合折中方案。
定期刪除策略每隔一段時(shí)間執(zhí)行一次刪除過(guò)期鍵操作,并通過(guò)限制刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少刪除操作對(duì)CPU時(shí)間的影響,同時(shí),通過(guò)定期刪除過(guò)期鍵,也有效地減少了因?yàn)檫^(guò)期鍵而帶來(lái)的內(nèi)存浪費(fèi)。
2. Redis使用的過(guò)期鍵刪除策略
Redis服務(wù)器使用的是惰性刪除策略和定期刪除策略。(逐出策略)
?Redis使用內(nèi)存存儲(chǔ)數(shù)據(jù),在執(zhí)行每一天命令前,都會(huì)調(diào)用freeMemorylfNeeded()檢測(cè)內(nèi)存釋放充足,如果內(nèi)存不滿足要加入數(shù)據(jù)的最低要求,redis會(huì)臨時(shí)刪除一些數(shù)據(jù)為當(dāng)前指令清理存儲(chǔ)空間。清理數(shù)據(jù)的策略稱為逐出算法。
2.1 惰性刪除策略的實(shí)現(xiàn)
過(guò)期鍵的惰性刪除策略由expireIfNeeded函數(shù)實(shí)現(xiàn),所有讀寫數(shù)據(jù)庫(kù)的Redis命令在執(zhí)行之前都會(huì)調(diào)用expireIfNeeded函數(shù)對(duì)輸入鍵進(jìn)行檢查:
- 如果輸入鍵已經(jīng)過(guò)期,那么將輸入鍵從數(shù)據(jù)庫(kù)中刪除
- 如果輸入鍵未過(guò)期,那么不做任何處理
以上描述可以使用如下流程圖表示:
2.2 定期刪除策略的實(shí)現(xiàn)
過(guò)期鍵的定期刪除策略由activeExpireCycle函數(shù)實(shí)現(xiàn),每當(dāng)Redis服務(wù)器的周期性操作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ò)期鍵。
原文鏈接:https://blog.csdn.net/weixin_67588007/article/details/126455553
相關(guān)推薦
- 2023-03-01 React?useState的錯(cuò)誤用法避坑詳解_React
- 2022-07-12 Linux中xargs命令的用法
- 2023-07-10 分布式緩存之Redis(持久化、主從、哨兵、分片集群)
- 2024-03-15 Spring Framework對(duì)DAO(Data Access Object)的支持
- 2022-07-18 C語(yǔ)言簡(jiǎn)明講解歸并排序的應(yīng)用_C 語(yǔ)言
- 2022-07-21 常見CSS樣式
- 2023-07-02 jQuery和HTML對(duì)某個(gè)標(biāo)簽設(shè)置只讀或者禁用屬性的方式_jquery
- 2022-03-24 .NET?6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)API版本控制_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支