# EXPIRE
**EXPIRE key seconds**
為給定 `key` 設置生存時間,當 `key` 過期時(生存時間為 `0` ),它會被自動刪除。
在 Redis 中,帶有生存時間的 `key` 被稱為『易失的』(volatile)。
生存時間可以通過使用 [_DEL_](del.html#del) 命令來刪除整個 `key` 來移除,或者被 [_SET_](../string/set.html#set) 和 [_GETSET_](../string/getset.html#getset) 命令覆寫(overwrite),這意味著,如果一個命令只是修改(alter)一個帶生存時間的 `key` 的值而不是用一個新的 `key` 值來代替(replace)它的話,那么生存時間不會被改變。
比如說,對一個 `key` 執行 [_INCR_](../string/incr.html#incr) 命令,對一個列表進行 [_LPUSH_](../list/lpush.html#lpush) 命令,或者對一個哈希表執行 [_HSET_](../hash/hset.html#hset) 命令,這類操作都不會修改 `key` 本身的生存時間。
另一方面,如果使用 [_RENAME_](rename.html) 對一個 `key` 進行改名,那么改名后的 `key` 的生存時間和改名前一樣。
[_RENAME_](rename.html) 命令的另一種可能是,嘗試將一個帶生存時間的 `key` 改名成另一個帶生存時間的 `another_key` ,這時舊的 `another_key` (以及它的生存時間)會被刪除,然后舊的 `key` 會改名為 `another_key` ,因此,新的 `another_key` 的生存時間也和原本的 `key` 一樣。
使用 [_PERSIST_](persist.html) 命令可以在不刪除 `key` 的情況下,移除 `key` 的生存時間,讓 `key` 重新成為一個『持久的』(persistent) `key` 。
**更新生存時間**
可以對一個已經帶有生存時間的 `key` 執行 [_EXPIRE_](#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
```
## 模式:導航會話
假設你有一項 web 服務,打算根據用戶最近訪問的 N 個頁面來進行物品推薦,并且假設用戶停止閱覽超過 60 秒,那么就清空閱覽記錄(為了減少物品推薦的計算量,并且保持推薦物品的新鮮度)。
這些最近訪問的頁面記錄,我們稱之為『導航會話』(Navigation session),可以用 [_INCR_](../string/incr.html#incr) 和 [_RPUSH_](../list/rpush.html#rpush) 命令在 Redis 中實現它:每當用戶閱覽一個網頁的時候,執行以下代碼:
```
MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC
```
如果用戶停止閱覽超過 60 秒,那么它的導航會話就會被清空,當用戶重新開始閱覽的時候,系統又會重新記錄導航會話,繼續進行物品推薦。
- Redis 文檔
- 鍵空間通知(keyspace notification)
- 事務(transaction)
- 發布與訂閱(pub/sub)
- 復制(Replication)
- 通信協議(protocol)
- 持久化(persistence)
- Sentinel
- 集群教程
- Redis 集群規范
- Redis 命令參考
- Key(鍵)
- DEL
- DUMP
- EXISTS
- EXPIRE
- EXPIREAT
- KEYS
- MIGRATE
- MOVE
- OBJECT
- PERSIST
- PEXPIRE
- PEXPIREAT
- PTTL
- RANDOMKEY
- RENAME
- RENAMENX
- RESTORE
- SORT
- TYPE
- SCAN
- String(字符串)
- APPEND
- BITCOUNT
- BITOP
- DECR
- DECRBY
- GET
- GETBIT
- GETRANGE
- GETSET
- INCR
- INCRBY
- INCRBYFLOAT
- MGET
- MSET
- MSETNX
- PSETEX
- SET
- SETBIT
- SETEX
- SETNX
- SETRANGE
- STRLEN
- Hash(哈希表)
- HDEL
- HEXISTS
- HGET
- HGETALL
- HINCRBY
- HINCRBYFLOAT
- HKEYS
- HLEN
- HMGET
- HMSET
- HSET
- HSETNX
- HVALS
- HSCAN
- List(列表)
- BLPOP
- BRPOP
- BRPOPLPUSH
- LINDEX
- LINSERT
- LLEN
- LPOP
- LPUSH
- LRANGE
- LREM
- LSET
- LTRIM
- RPOP
- RPOPLPUSH
- RPUSH
- RPUSHX
- Set(集合)
- SADD
- SCARD
- SDIFF
- SDIFFSTORE
- SINTER
- SINTER
- SINTERSTORE
- SISMEMBER
- SMEMBERS
- SMOVE
- SPOP
- SRANDMEMBER
- SREM
- SUNION
- SUNIONSTORE
- SSCAN
- SortedSet(有序集合)
- ZADD
- ZCARD
- ZCOUNT
- ZINCRBY
- ZRANGE
- ZRANGEBYSCORE
- ZRANK
- ZREM
- ZREMRANGEBYRANK
- ZREMRANGEBYSCORE
- ZREVRANGE
- ZREVRANGEBYSCORE
- ZREVRANK
- ZSCORE
- ZUNIONSTORE
- ZINTERSTORE
- ZSCAN
- Pub/Sub(發布/訂閱)
- PSUBSCRIBE
- PUBLISH
- PUBSUB
- PUNSUBSCRIBE
- SUBSCRIBE
- UNSUBSCRIBE
- Transaction(事務)
- DISCARD
- EXEC
- MULTI
- UNWATCH
- WATCH
- Script(腳本)
- EVAL
- EVALSHA
- SCRIPT EXISTS
- SCRIPT FLUSH
- SCRIPT KILL
- SCRIPT LOAD
- Connection(連接)
- AUTH
- ECHO
- PING
- QUIT
- SELECT
- Server(服務器)
- BGREWRITEAOF
- BGSAVE
- CLIENT GETNAME
- CLIENT KILL
- CLIENT LIST
- CLIENT SETNAME
- CONFIG GET
- CONFIG RESETSTAT
- CONFIG REWRITE
- CONFIG SET
- DBSIZE
- DEBUG OBJECT
- DEBUG SEGFAULT
- FLUSHALL
- FLUSHDB
- INFO
- LASTSAVE
- MONITOR
- PSYNC
- SAVE
- SHUTDOWN
- SLAVEOF
- SLOWLOG
- SYNC
- TIME
- 關于