Redis存留時間,對Redis的鍵設定存留時間

來源:互聯網
上載者:User


  Redis對鍵提供存留時間,在不指定存留時間時,存留時間是永久。時間到期後Redis會自動刪除這個鍵。可以用EXPIRE命令,時間單位時秒,如果一個鍵是被設為有限的存留時間,那麼在SET key進行重新賦值的時候會被再次設為永久:
SET session:captcha sd2a
EXPIRE session:captcha 600

    取消存留時間,將鍵的存留時間設為永久,是PERSIST:
PERSIST session:captcha

    查看一個鍵的存留時間用TTL命令,-1表示永久或者以及到期被刪除。
TTL session:captcha

    在Redis的INCR,LPUSH,HSET,ZREM等命令時不會改變存留時間的。
    想要精確到毫米來控制時間,就需要PEXPIRE即可,使用PTTL查看剩餘時間。
    如果想要給定一個到期的時間而不是多少秒後到期呢?就需要EXPIREAT和PEXPIREAT。EXPIREAT的參數是到期時的時間戳記(秒),PEXPIREAT的參數是到期時間是時間戳記(毫秒)
SET session:captcha sd2a
EXPIREAT session:captcha 1399902009
PEXPIREAT session:captcha 1399902009000

 

    應用情境一:訪問頻率限制:我們限定每個使用者1分鐘只能瀏覽10個頁面。虛擬碼如下:
$isExists = EXISTS limit:user1:192.168.1.2
if($isExists){
    $num = INCR limit:user1:192.168.1.2
    if($num > 10){
        print '超過限制'
        exit
    }
}else{
    MULTI
    INCR limit:user1:192.168.1.2
    EXPIRE limit:user1:192.168.1.2 60
    EXEC
}

    我們用了事務的原因是因為,加入在執行了INCR limit:user1:192.168.1.2之後,在執行EXPIRE limit:user1:192.168.1.2 60之前,用戶端被關閉了。那麼這個鍵和值就會被持久化儲存。且該ID終身只能訪問10次了。這就太糟糕了。


    應用情境二:實現緩衝。計算一萬名使用者的熱門排行榜,是很耗費資源的,那麼我們把資料在第一次計算後存進一個key,然後對這個key設定存留時間。在1個小時後存留時間到期,key被刪除,再次進行計算新排名並儲存的一個臨時key。我們用虛擬碼實現:
//戰鬥熱門排行榜
$rank = GET cache:rank:fight
if not $rank
    $rank = 計算排名()
    MULTI
    SET cache:rank:fight $rank
    EXPIRE cache:rank:fight 3600
    EXEC

    Redis是記憶體儲存的資料庫,假如記憶體被緩衝佔滿了,Redis會根據設定檔來刪除一定的緩衝。配置項是Redis的設定檔中的maxmemory參數,單位是位元組。超過這個限制之後,會根據設定檔的maxmemory-policy參數來刪除不需要的鍵。maxmemory-policy的可選規則是如下四種:
    1、volatile-lru:使用LRU演算法刪除一個鍵(設定了存留時間的鍵)。
    2、allkey-lru:使用LRU演算法刪除一個鍵。
    3、volatile-random:隨即刪除一個鍵(設定了存留時間的鍵)。
    4、allkey-random:隨即刪除一個鍵。
    5、volatile-ttl:刪除存留時間即將到期的一個鍵。是隨即取出來N個鍵,然後刪除N個鍵中即將到期的鍵,而不是遍曆所有的鍵刪除即將到期的。N是幾?設定檔配的。
    6、nevication:不刪除,返回錯誤。


Redis設定Key的到期時間 – EXPIRE命令

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
1. 在小於2.1.3的redis版本裡,只能對key設定一次expire。redis2.1.3和之後的版本裡,可以多次對key使用expire命令,更新key的expire time。
2. redis術語裡面,把設定了expire time的key 叫做:volatile keys。 意思就是不穩定的key。

 

3. 如果對key使用set或del命令,那麼也會移除expire time。尤其是set命令,這個在編寫程式的時候需要注意一下。
4. redis2.1.3之前的老版本裡,如果對volatile keys 做相關寫入操作(LPUSH,LSET),和其他一些觸發修改value的操作時,redis會刪除 該key。 也就是說 :

redis.expire(key,expiration);

redis.lpush(key,field,value);

redis.get(key) //return null

redis2.1.3之後的版本裡面沒有這個約束,可以任意修改。

 

redis.set(key,100);

redis.expire(key,expiration);

redis.incr(key)

redis.get(key)

//redis2.2.2 return 101; redis<2.1.3 return 1;
5. redis對到期鍵採用了lazy expiration:在訪問key的時候判定key是否到期,如果到期,則進行到期處理。其次,每秒對volatile keys 進行抽樣測試,如果有到期鍵,那麼對所有到期key進行處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.