redis的過期時間設定和過期刪除機制
expire : 將鍵的生存時間設為 ttl 秒
pexpire :將鍵的生存時間設為 ttl 毫秒
expireat :將鍵的過期時間設為 timestamp 所指定的秒數時間戳
pexpireat : 將鍵的過期時間設為 timestamp 所指定的毫秒數時間戳.
二:儲存過期時間
那麼redis裡面對這些key的過期時間和生存時間的資訊是怎麼儲存的呢??
答:在資料庫結構redisdb中的expires字典中儲存了資料庫中所有鍵的過期時間,我們稱expire這個字典為過期字典。
(1)過期字典是乙個指標,指向鍵空間的某個鍵物件。
(2)過期字典的值是乙個longlong型別的整數,這個整數儲存了鍵所指向的資料庫鍵的過期時間–乙個毫秒級的 unix 時間戳。
下圖是乙個帶過期字典的資料庫例子:
paste_image.png
過期字典是儲存在redisdb這個結構裡的:
typedef struct redisdb redisdb;
從以上結構中可以看到expire字典(過期字典)和dict字典(資料庫鍵空間,儲存著資料庫中所有鍵值對)是並列的,由此可見expire字典的重要性。
redis> persist book
(integer) 1
資料庫將更新成如下狀態:
paste_image.png
可以從圖中看到,當persist book命令執行之後,過期字典中的 book 鍵消失了。
四:計算並返回剩餘生存時間
ttl命令以秒為單位返回指定鍵的剩餘生存時間。pttl以毫秒返回。兩個命令都是通過計算當前時間和過期時間的差值得到剩餘生存期的。
127.0.0.1:6379> set minping shuxin
ok127.0.0.1:6379> expire minping 60
(integer) 1
127.0.0.1:6379> ttl minping
(integer) 57
127.0.0.1:6379> ttl minping
(integer) 27
127.0.0.1:6379> pttl minping
(integer) 23839
127.0.0.1:6379>
redis原始碼為:
void ttlcommand(redisclient *c)
void pttlcommand(redisclient *c)
void ttlgenericcommand(redisclient *c, int output_ms)
/* 如果鍵存在*/
/*如果沒有設定生存時間,返回 -1, 否則返回實際剩餘時間 */
expire = getexpire(c->db,c->ar**[1]);
if (expire != -1)
if (ttl == -1) else
}五:過期鍵的刪除策略
如果乙個鍵是過期的,那它到了過期時間之後是不是馬上就從記憶體中被被刪除呢??如果不是,那過期後到底什麼時候被刪除呢??
而且目前redis事件處理器對時間事件的處理方式--無序鍊錶,查詢乙個key的時間複雜度為o(n),所以並不適合用來處理大量的時間事件。
惰性刪除
惰性刪除是指,某個鍵值過期後,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。所以惰性刪除的缺點很明顯:浪費記憶體。dict字典和expires字典都要儲存這個鍵值的資訊。
舉個例子,對於一些按時間點來更新的資料,比如log日誌,過期後在很長的一段時間內可能都得不到訪問,這樣在這段時間內就要拜拜浪費這麼多記憶體來存log。這對於效能非常依賴於記憶體大小的redis來說,是比較致命的。
六:redis使用的策略
redis使用的過期鍵值刪除策略是:惰性刪除加上定期刪除,兩者配合使用。
Redis 設定過期時間
redis 中有個設定時間過期的功能,即對儲存在 redis 資料庫中的值可以設定乙個過期時間。作為乙個快取資料庫,這是非常實用的。比如,一般專案中的 token 或是 cookie 資訊,尤其是簡訊驗證碼,都是有時間限制的,按照傳統的資料庫處理方式,一般都是自己判斷過期,這樣無疑會嚴重影響專案效能...
Redis的過期時間和過期刪除機制
有時候我們並不希望redis的key一直存在。例如快取,驗證碼等資料,我們希望它們能在一定時間內自動的被銷毀。redis提供了一些命令,能夠讓我們對key設定過期時間,並且讓key過期之後被自動刪除。1.expire pexpire expire介面定義 expire key seconds 介面描...
Redis 過期鍵的設定 獲取和刪除過期時間
設定過期 預設情況下鍵是沒有生存時間的,也就是永不過期,除非清空記憶體。設定的鍵的生存時間也很容易,可以通過4個命令設定 任選一即可 expire pexpire expireat pexpireat命令,這4個命令看起來不同但是背後實現原理都是一樣的。常用的其實就是expire和pexpire這兩...