1. 程式人生 > 實用技巧 >redis-資料庫 鍵過期如何刪除

redis-資料庫 鍵過期如何刪除

參考:http://origin.redisbook.com/internal/db.html

Redis 有四個命令可以設定鍵的生存時間(可以存活多久)和過期時間(什麼時候到期):

  • EXPIRE以秒為單位設定鍵的生存時間;
  • PEXPIRE以毫秒為單位設定鍵的生存時間;
  • EXPIREAT以秒為單位,設定鍵的過期 UNIX 時間戳;
  • PEXPIREAT以毫秒為單位,設定鍵的過期 UNIX 時間戳。

redis通過EXPIREPEXPIREEXPIREATPEXPIREAT四個命令, 客戶端可以給某個存在的鍵設定過期時間, 當鍵的過期時間到達時, 鍵就不再可用。

在資料庫中, 所有鍵的過期時間都被儲存在redisDb

結構的expires字典裡:

typedef struct redisDb {

    // ...

    dict *expires;

    // ...

} redisDb;

expires字典的鍵是一個指向dict字典(鍵空間)裡某個鍵的指標, 而字典的值則是鍵所指向的資料庫鍵的到期時間, 這個值以longlong型別表示。

下圖展示了一個含有三個鍵的資料庫,其中numberbook兩個鍵帶有過期時間:

為了展示的方便, 圖中重複出現了兩次number鍵和book鍵。 在實際中, 鍵空間字典的鍵和過期時間字典的鍵都指向同一個字串物件, 所以不會浪費任何空間。

1、如何判斷鍵過期了?

通過expires字典, 可以用以下步驟檢查某個鍵是否過期:

a、檢查鍵是否存在於expires字典:如果存在,那麼取出鍵的過期時間;

b、檢查當前 UNIX 時間戳是否大於鍵的過期時間:如果是的話,那麼鍵已經過期;否則,鍵未過期。

2、過期鍵 什麼時候刪除?

a、定時刪除:在設定鍵的過期時間時,建立一個定時事件,當過期時間到達時,由事件處理器自動執行鍵的刪除操作。

b、惰性刪除:放任鍵過期不管,但是在每次從dict字典中取出鍵值時,要檢查鍵是否過期,如果過期的話,就刪除它,並返回空;如果沒過期,就返回鍵值。

c、定期刪除:每隔一段時間,對expires字典進行檢查,刪除裡面的過期鍵。