Redis設置和更新Key的過期時間


 

 
        

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就會被重置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM