先來回顧一下Redis鍵的生存時間,過期時間的設置;然后會講到過期鍵刪除策略;然后會聊其他功能對過期鍵的處理。
2.鍵的生存時間
鍵過期時間設置通過Expire命令或者Pexpire命令,客戶端可以以毫秒級的精度為數據庫中的某個鍵設置生存時間,一段時間后Redis服務器會刪除生存時間為0的鍵。下面我們看一下Redis鍵的過期時間設置,以及查詢鍵剩余壽命。
EXPIRE key 5 #設置一個鍵的過期時間 單位秒
EXPIREAT KEY 1660753861 #設置過期時間某個時間戳過期(UNIX時間戳)單位秒
PEXPIRE key 33 #設置一個鍵的過期時間 單位毫秒
PEXPIREAT key 1660839534000 #設置過期時間某個時間戳過期(UNIX時間戳)單位毫秒
TTL key # 返回鍵的剩余過期時長,單位秒
PTTL key # 返回鍵的剩余過期時長,單位毫秒
Redis中的這些鍵的過期時間如何保存
Redis中維護了一個過期字典。其數據結構中,字典的鍵是一個指針,指向某個數據庫鍵,而字典的鍵值則是一個long類型的整數,表示一個毫秒精度的UNIX時間戳。
其實上面幾種設置鍵過期時間的命令相當于最后都是調用 PEXPIREAT 這個命令。
3.鍵的過期刪除策略
3.1 如何判定鍵過期
Redis中判斷鍵是否過期會使用以下的方法
- 檢查給定的鍵是否存在于過期字典,如果存在則獲取鍵的過期時間
- 檢查當前的UNIX時間戳是否大于鍵的過期時間戳,大于過期時間戳的話則判定鍵過期
3.2 三種過期鍵刪除策略
常見刪除策略有三種:定時刪除、惰性刪除、定期刪除
3.2.1定時刪除
定時刪除是在設置鍵的過期時間時,設置一個定時器,定時器會在鍵的過期時間到來時立即刪除鍵
- 優點:內存友好,可以保證過期鍵盡可能快速地被刪除,釋放內存。
- 缺點:CPU資源分配不友好,如果過期鍵比較多的時候,此時刪除會占用大量的CPU資源,從而間接影響Redis的性能。
3.2.2惰性刪除
惰性刪除只會在程序需要使用鍵時,才會對當前鍵進行過期檢查,而不會去刪除其他的過期鍵。
- 優點:CPU資源耗費小,因為只是在取出鍵的時候才會做過期檢查,并刪除等操作。
- 缺點:過期鍵會占用內存,如果一個過期鍵永遠不被使用,那么就永遠不能被刪除,會造成內存泄漏。
惰性刪除執行步驟如下:
- 執行讀寫命令時去檢查鍵的過期時間
- 如果鍵過期,刪除鍵,整個流程會按照鍵不存在的情況處理
- 如果鍵未過期,則按照鍵存在的情況執行命令
3.2.3定期刪除
定期刪除是每隔一段時間執行一次過期鍵刪除操作,可以通過限制刪除的操作執行的時長和頻率來減少CPU資源占用。同時定期刪除策略不會導致過期鍵過多的堆積,造成大量內存泄漏。
定期刪除策略有兩個點比較重要,執行時長和執行頻率。需要兩者結合才能達到最優的效果。
定期刪除步驟:
- 從設置過期時間的key的集合中隨機檢查20個key
- 刪除其中的過期鍵。如果檢查結果中25%以上的key過期,則開始新一輪任務。
- 每次會按順序在每個數據庫執行,如果在3號數據庫返回,則會記錄下來,下次刪除操作執行的時候會從4號數據庫開始,就這樣循環遍歷整個Redis數據庫。
定期任務執行頻率:
為了定期檢測資源和服務狀態并根據預定策略執行相應的操作,Redis會調用內部函數來執行多種后臺任務。
其執行頻率由hz參數指定,默認為10,即每秒執行10次。
image-20220821131302978
這個值可以設置1-500,但是官方建議設置100以下,設置過大會造成CPU資源占用過大。基本上只用默認值就能滿足大部分需求。
4.其他功能對過期鍵的處理
Redis數據保存有AOF和RDB兩種功能。對于過期鍵的處理也不相同。
RDB持久化對過期鍵的處理:
- 生成RDB文件時。 過期key會被忽略,從而不會被保存到RDB文件中
- 加載RDB文件。
- 主服務器模式。載入RDB文件時,會對key的過期時間進行檢查,過期鍵會被忽略,不會加載到Redis中
- 從服務器模式。所有數據key都會加載到Redis中
AOF持久化對過期鍵的處理:
- AOF文件寫入的時候,會append刪除語句, DEL key 。
- AOF重寫的時候過期key則不會被寫入AOF文件中。
當Redis服務器處于復制模式時對過期鍵的處理:
- 主服務器刪除key時,會向從服務器發送DEL命令
- 從服務器不會處理過期key
- 從服務器只有接到Master發送的DEL命令才會刪除key
總結
Redis的過期策略采用惰性刪除和定期刪除兩種組合方式,其中惰性刪除保證過期鍵一點過不會被使用,定期刪除可以保證過期數據得到釋放,優化資源占用率。
-
服務器
+關注
關注
12文章
9335瀏覽量
86135 -
定時器
+關注
關注
23文章
3256瀏覽量
115450 -
數據庫
+關注
關注
7文章
3852瀏覽量
64741 -
Redis
+關注
關注
0文章
379瀏覽量
10967
發布評論請先 登錄
相關推薦
如何排查Redis性能問題 Redis內部實現原理解析
![如何排查<b class='flag-5'>Redis</b>性能問題 <b class='flag-5'>Redis</b>內部實現原理解析](https://file1.elecfans.com/web2/M00/8C/0B/wKgZomSk82GAFJVGAAA6yMvYDfs364.png)
網絡存儲系統可生存性量化評估
無線傳感器網絡節能策略
淺析cache控制器的分配策略與替換策略
WDM光網絡生存性策略及仿真
WDM網狀網的生存性問題研究
帶無線能量補充設備的WSN基站部署策略
Redis 的數據清理策略
![<b class='flag-5'>Redis</b> 的數據清理<b class='flag-5'>策略</b>](https://file1.elecfans.com/web2/M00/A5/26/wKgaomUJP6-AaHL9AAAkbqGzeyM492.png)
評論