redis-資料庫 鍵過期如何刪除
阿新 • • 發佈:2020-07-28
參考:http://origin.redisbook.com/internal/db.html
Redis 有四個命令可以設定鍵的生存時間(可以存活多久)和過期時間(什麼時候到期):
- EXPIRE以秒為單位設定鍵的生存時間;
- PEXPIRE以毫秒為單位設定鍵的生存時間;
- EXPIREAT以秒為單位,設定鍵的過期 UNIX 時間戳;
- PEXPIREAT以毫秒為單位,設定鍵的過期 UNIX 時間戳。
redis通過EXPIRE、PEXPIRE、EXPIREAT和PEXPIREAT四個命令, 客戶端可以給某個存在的鍵設定過期時間, 當鍵的過期時間到達時, 鍵就不再可用。
在資料庫中, 所有鍵的過期時間都被儲存在redisDb
expires
字典裡:
typedef struct redisDb {
// ...
dict *expires;
// ...
} redisDb;
expires
字典的鍵是一個指向dict
字典(鍵空間)裡某個鍵的指標, 而字典的值則是鍵所指向的資料庫鍵的到期時間, 這個值以longlong
型別表示。
下圖展示了一個含有三個鍵的資料庫,其中number
和book
兩個鍵帶有過期時間:
為了展示的方便, 圖中重複出現了兩次number
鍵和book
鍵。 在實際中, 鍵空間字典的鍵和過期時間字典的鍵都指向同一個字串物件, 所以不會浪費任何空間。
1、如何判斷鍵過期了?
通過expires
字典, 可以用以下步驟檢查某個鍵是否過期:
a、檢查鍵是否存在於expires
字典:如果存在,那麼取出鍵的過期時間;
b、檢查當前 UNIX 時間戳是否大於鍵的過期時間:如果是的話,那麼鍵已經過期;否則,鍵未過期。
2、過期鍵 什麼時候刪除?
a、定時刪除:在設定鍵的過期時間時,建立一個定時事件,當過期時間到達時,由事件處理器自動執行鍵的刪除操作。
b、惰性刪除:放任鍵過期不管,但是在每次從dict
字典中取出鍵值時,要檢查鍵是否過期,如果過期的話,就刪除它,並返回空;如果沒過期,就返回鍵值。
c、定期刪除:每隔一段時間,對expires
字典進行檢查,刪除裡面的過期鍵。