Redis對鍵提供生存時間,在不指定生存時間時,生存時間是永久。時間到期後Redis會自動刪除這個鍵。能夠用EXPIRE命令,時間單位時秒,若是一個鍵是被設爲有限的生存時間,那麼在SET key進行從新賦值的時候會被再次設爲永久:
SET session:captcha sd2a
EXPIRE session:captcha 600php
取消生存時間,將鍵的生存時間設爲永久,是PERSIST:
PERSIST session:captchahtml
查看一個鍵的生存時間用TTL命令,-1表示永久或者以及到期被刪除。
TTL session:captchajava
在Redis的INCR,LPUSH,HSET,ZREM等命令時不會改變生存時間的。
想要精確到毫米來控制時間,就須要PEXPIRE便可,使用PTTL查看剩餘時間。
若是想要給定一個到期的時間而不是多少秒後到期呢?就須要EXPIREAT和PEXPIREAT。EXPIREAT的參數是到期時的時間戳(秒),PEXPIREAT的參數是到期時間是時間戳(毫秒)
SET session:captcha sd2a
EXPIREAT session:captcha 1399902009
PEXPIREAT session:captcha 1399902009000redis
應用場景一:訪問頻率限制:咱們限定每一個用戶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。咱們用僞代碼實現:json
//戰鬥排行榜 $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的可選規則是以下四種:
緩存
一、volatile-lru:使用LRU算法刪除一個鍵(設置了生存時間的鍵)。 二、allkey-lru:使用LRU算法刪除一個鍵。 三、volatile-random:隨即刪除一個鍵(設置了生存時間的鍵)。 四、allkey-random:隨即刪除一個鍵。 五、volatile-ttl:刪除生存時間即將過時的一個鍵。是隨即取出來N個鍵,而後刪除N個鍵中即將過時的 鍵,而不是遍歷全部的鍵刪除即將過時的。N是幾?配置文件配的。 六、nevication:不刪除,返回錯誤。
Redis設置Key的過時時間 – EXPIRE命令session
EXPIRE key secondsdom
爲給定 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進行處理