Redis過期鍵

前言

Redis是一個鍵值對(key-value pair)數據庫服務器,服務器中的每個數據庫都由一個redis.h/redisDb結構表示,redisDb結構中dict字典保存了數據庫中的所有鍵值對,當我們給某個鍵值添加過期時間時(expire或pexpire),redisDb結構會開闢一個expires的字典用來保存dict字典中所有過期鍵的過期時間.
expires過期字典中的鍵值是一個指針,指向鍵空間中的某個鍵對象.值是一個long類型的時間戳,保存了鍵指針所指向的數據庫鍵的過期時間——一個毫秒精度的UNIX時間戳.

過期鍵的判定

通過expires過期字典,Redis可以檢查一個鍵是否過期:

  1. 檢查dict字典中的鍵是否存在於expires過期字典中,如果存在,取得UNIX過期時間戳.
  2. 檢查UNIX過期時間戳是否大於鍵的過期時間,如果大於,則鍵過期;否則鍵未過期.

我們可以用TTL命令或PTTL命令獲取某個鍵的是否過期.

過期鍵刪除策略

Redis有三種過期鍵的刪除策略:

  1. 定時刪除:設置鍵的過期時間的同時,創建一個timer定時器,該定時器在鍵過期時間來臨時對鍵執行刪除操作.
  2. 惰性刪除:每次從dict鍵空間獲取鍵值時,檢查並判斷該鍵是否存在過期時間,是否過期,如果過期就刪除該鍵,如果沒有,就返回該鍵.
  3. 定期刪除:每隔一段時間對dict字典和expires字典做一次檢查,刪除過期鍵.

上訴三種策略中,1,3是主動刪除策略,2是被動刪除策略.它們各有利弊.

1.定時刪除

定時刪除對內存最友好,但對CPU最不友好.在過期鍵比較多的情況下,過多的timer定時器會佔用比較多的CPU時間.影響服務器的響應時間和吞吐量.

2.惰性刪除

惰性刪除對CPU最友好,但對內存最不友好.當某些鍵不再被訪問時,過期鍵將永遠不會刪除.浪費內存,有內存泄露的危險.

3.定期刪除

定時刪除和惰性刪除的缺點都太明顯,定期刪除策略是前兩種策略的整合折中的方式.
定期刪除通過限制刪除操作的執行時長和頻率來減少對CPU的影響,通過定期刪除過期鍵,有效減少因爲過期鍵而造成的內存浪費.

目前Redis服務器使用的是惰性刪除和定期刪除的過期鍵刪除策略. 通過這兩種刪除策略,服務器可以很好的在CPU和內存空間之間取得平衡.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章