Redis實現系列 過期鍵處理

2021-10-10 09:53:18 字數 2680 閱讀 9236

過期鍵處理

過期鍵的判定

通過過期字典,程式可以用以下步驟檢查乙個給定鍵是否過期:

偽**描述

def

is_expired

(key)

:# 取得鍵的過期時間

expire_time_in_ms = redisdb.expires.get(key)

# 鍵沒有設定過期時間

if expire_time_in_ms is

none

:return

false

# 取得當前時間的unix時間戳

now_ms = get_current_unix_timestamp_in_ms(

)# 檢查當前時間是否大於鍵的過期時間

if now_ms > expire_time_in_ms:

# 是,鍵已經過期

return

true

else

:# 否,鍵未過期

return

false

過期鍵刪除策略概念

三種策略,第一種和第三種為主動刪除策略,而第二種則為被動刪除策略。

惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

定期刪除:每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個資料庫,則由演算法決定。

定期刪除策略是前兩種策略的一種整合和折中:

定期刪除策略的難點是確定刪除操作執行的時長和頻率:

如果刪除操作執行得太少,或者執行的時間太短,定期刪除策略又會和惰性刪除策略一樣,出現浪費記憶體的情況。

過期鍵刪除實現

redis伺服器實際使用的是惰性刪除和定期刪除兩種策略:

惰性刪除策略的實現

因為每個被訪問的鍵都可能因為過期而被expireifneeded函式刪除,所以每個命令的實現函式都必須能同時處理鍵存在以及鍵不存在這兩種情況:

定期刪除策略實現

偽**描述

# 預設每次檢查的資料庫數量

default_db_numbers =

16# 預設每個資料庫檢查的鍵數量

default_key_numbers =

20# 全域性變數,記錄檢查進度

current_db =

0def

activeexpirecycle()

:# 初始化要檢查的資料庫數量

# 如果伺服器的資料庫數量比 default_db_numbers 要小,那麼以伺服器的資料庫數量為準

if server.dbnum < default_db_numbers:

db_numbers = server.dbnum

else

: db_numbers = default_db_numbers

# 遍歷各個資料庫

for i in

range

(db_numbers)

:# 如果current_db 的值等於伺服器的資料庫數量

# 這表示檢查程式已經遍歷了伺服器的所有資料庫一次

# 將current_db 重置為0,開始新的一輪遍歷

if current_db == server.dbnum:

current_db =

0# 獲取當前要處理的資料庫

redisdb = server.db[current_db]

# 將資料庫索引增1,指向下乙個要處理的資料庫

current_db +=

1# 檢查資料庫鍵

for j in

range

(default_key_numbers)

:# 如果資料庫中沒有乙個鍵帶有過期時間,那麼跳過這個資料庫

if redisdb.expires.size()==

0:break

# 隨機獲取乙個帶有過期時間的鍵

key_with_ttl = redisdb.expires.get_random_key(

)# 檢查鍵是否過期,如果過期就刪除它

if is_expired(key_with_ttl)

: delete_key(key_with_ttl)

# 已達到時間上限,停止處理

if reach_time_limit():

return

過期鍵影響

rdb檔案

載入rdb檔案:在啟動redis伺服器時,如果伺服器開啟了rdb功能,那麼伺服器將對rdb檔案進行載入

aof檔案

aof重寫:和生成rdb檔案時類似,在執行aof重寫的過程中

複製(集群)

小結redis伺服器的所有資料庫都儲存在redisserver.db陣列中,而資料庫的數量則由redisserver.dbnum屬性儲存。

資料庫主要由dict和expires兩個字典構成,其中dict字典負責儲存鍵值對,而expires字典則負責儲存鍵的過期時間。

Redis 鍵過期處理策略

redis可以給乙個key設定過期時間,當key過期以後,並不會馬上自動釋放。redis對於過期鍵的處理,分為被動刪除和主動刪除兩種方式。1.被動刪除 當客戶端訪問到乙個已經過期的鍵但尚未刪除,redis就會主動把它刪除。2.主動刪除 redis每秒會迴圈10次以下操作 隨機抽取20個具有過期時間的...

redis 過期處理

常見過期策略 1.定時刪除 不建議使用 在乙個鍵設定過期時間的同時為該鍵建立乙個定時器,時間到來的時刻刪除該鍵 優點 記憶體釋放快 缺點 大量鍵的定時器影響效能 2.惰性刪除 在對鍵程序獲取或者處理的時候驗證是否過期,過期則刪除返回null 優點 cpu占用少 缺點 大量未過期未刪除的鍵未刪除釋放記...

Redis時間過期處理

目的 業務邏輯為利用usertoken為key在redis中儲存,當不操作時間超過20分鐘時,清空redis,使得使用者重新登入。redis對儲存值的過期處理實際上是針對該值的鍵 key 處理的,即時間的設定也是設定key的有效時間。expires字典儲存了所有鍵的過期時間,expires也被稱為過...