EXPIRE key seconds
為給定 key
設置生存時間,當 key
過期時(生存時間為 0
),它會被自動刪除。
在 Redis 中,帶有生存時間的 key
被稱為『易失的』(volatile)。
生存時間可以通過使用 DEL 命令來刪除整個 key
來移除,或者被 SET 和 GETSET 命令覆寫(overwrite),這意味着,如果一個命令只是修改(alter)一個帶生存時間的 key
的值而不是用一個新的 key
值來代替(replace)它的話,那么生存時間不會被改變。
比如說,對一個 key
執行 INCR 命令,對一個列表進行 LPUSH 命令,或者對一個哈希表執行 HSET 命令,這類操作都不會修改 key
本身的生存時間。
另一方面,如果使用 RENAME 對一個 key
進行改名,那么改名后的 key
的生存時間和改名前一樣。
RENAME 命令的另一種可能是,嘗試將一個帶生存時間的 key
改名成另一個帶生存時間的 another_key
,這時舊的 another_key
(以及它的生存時間)會被刪除,然后舊的 key
會改名為 another_key
,因此,新的 another_key
的生存時間也和原本的 key
一樣。
使用 PERSIST 命令可以在不刪除 key
的情況下,移除 key
的生存時間,讓 key
重新成為一個『持久的』(persistent) key
。
更新生存時間
可以對一個已經帶有生存時間的 key
執行 EXPIRE 命令,新指定的生存時間會取代舊的生存時間。
過期時間的精確度
在 Redis 2.4 版本中,過期時間的延遲在 1 秒鍾之內 —— 也即是,就算 key
已經過期,但它還是可能在過期之后一秒鍾之內被訪問到,而在新的 Redis 2.6 版本中,延遲被降低到 1 毫秒之內。
Redis 2.1.3 之前的不同之處
在 Redis 2.1.3 之前的版本中,修改一個帶有生存時間的 key
會導致整個 key
被刪除,這一行為是受當時復制(replication)層的限制而作出的,現在這一限制已經被修復。
- 可用版本:
- >= 1.0.0
- 時間復雜度:
- O(1)
- 返回值:
-
設置成功返回
1
。當key
不存在或者不能為key
設置生存時間時(比如在低於 2.1.3 版本的 Redis 中你嘗試更新key
的生存時間),返回0
。
redis> SET cache_page "www.google.com" OK redis> EXPIRE cache_page 30 # 設置過期時間為 30 秒 (integer) 1 redis> TTL cache_page # 查看剩余生存時間 (integer) 23 redis> EXPIRE cache_page 30000 # 更新過期時間 (integer) 1 redis> TTL cache_page (integer) 29996
下面來通過一個demo來更好的理解:
var ac_redis = require('../common/redis.js'); var key = "test_expire"; var num = 0; function setKeyValue() { var key = "test_expire"; var data = { name: "jason", age: 11 }; ac_redis.ac_login_mq.set(key, JSON.stringify(data), "EX", 10, function (err, result) { if (err) { console.log("redis set key error:", err); return; } console.log("redis set result:", result); }); } setKeyValue(); setInterval(function () { ac_redis.ac_login_id_ttl.ttl(key, function (err, result) { if (err) { console.log("redis ttl error:", err.toString()); } console.log("result:", result); num ++; if (num >= 5) { setImmediate(function () { ac_redis.ac_login_id_ttl.expire(key, 20); console.log("redis expire"); num = 0; }); } }); }, 1000);
在控制台中你會看到每過5秒之后key的TTL就會被重置。