通过EXPIRE key seconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。
在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定的。
当key被DEL命令删除或者被SET、GETSET命令重置后与之关联的过期时间会被清除。redis 127.0.0.1:6379> set mykey "test expire" OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 97 redis 127.0.0.1:6379> ttl mykey (integer) 93 redis 127.0.0.1:6379> set mykey "test expire reset" OK redis 127.0.0.1:6379> ttl mykey (integer) -1 redis 127.0.0.1:6379> set mykey "test expire" OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 98 redis 127.0.0.1:6379> ttl mykey (integer) 91 redis 127.0.0.1:6379> getset mykey "test expire reset" "test expire" redis 127.0.0.1:6379> ttl mykey (integer) -1这也意味着仅从概念上更新了存储在key中的值而没有用全新的值替换key原有值的所有操作都不会影响在该key上设置的过期时间。例如使用INCR命令增加key的值或者通过LPUSH命令在list中增加一个新的元素或者使用HSET命令更新hash字段的值都会回清除原有的过期时间设置。
redis 127.0.0.1:6379> set mykey 1 OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 95 redis 127.0.0.1:6379> incr mykey (integer) 2 redis 127.0.0.1:6379> ttl mykey (integer) 77 redis 127.0.0.1:6379> lpush listkey 1 (integer) 1 redis 127.0.0.1:6379> expire listkey 100 (integer) 1 redis 127.0.0.1:6379> ttl listkey (integer) 94 redis 127.0.0.1:6379> lpush listkey 2 (integer) 2 redis 127.0.0.1:6379> ttl listkey (integer) 82 redis 127.0.0.1:6379> hmset hashkey name "redis" passwd "redis" OK redis 127.0.0.1:6379> expire hashkey 100 (integer) 1 redis 127.0.0.1:6379> ttl hashkey (integer) 95 redis 127.0.0.1:6379> hset hashkey passwd "redis.vs.mysql" (integer) 0 redis 127.0.0.1:6379> ttl hashkey (integer) 66当然也可通过PERSIST命令清除已设置的过期时间重新将key变为持久的。
redis 127.0.0.1:6379> set mykey 'test clear expire' OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 96 redis 127.0.0.1:6379> persist mykey (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) -1若key被RENAME命令重命名则与之关联的过期时间将传递到新名称的key。
redis 127.0.0.1:6379> get mykeynew (nil) redis 127.0.0.1:6379> set mykey 'test expire transfer' OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 96 redis 127.0.0.1:6379> rename mykey mykeynew OK redis 127.0.0.1:6379> ttl mykey (integer) -1 redis 127.0.0.1:6379> ttl mykeynew (integer) 80若key被RENAME命令重写,比如本存在名为mykey_a和mykey_b的key一个RENAME mykey_b mykey_a命令将mykey_b重命名为本已存在的mykey_a那么无论mykey_a原来的设置如何都将继承mykey_b的所有特性,包括过期时间设置。
redis 127.0.0.1:6379> set mykey_b 'b' OK redis 127.0.0.1:6379> set mykey_a 'a' OK redis 127.0.0.1:6379> expire mykey_b 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey_b (integer) 93 redis 127.0.0.1:6379> ttl mykey_a (integer) -1 redis 127.0.0.1:6379> rename mykey_b mykey_a OK redis 127.0.0.1:6379> ttl mykey_b (integer) -1 redis 127.0.0.1:6379> ttl mykey_a (integer) 66EXPIRE key seconds应用于一个已经设置了过期时间的key上时原有的过期时间将被更新为新的过期时间
redis 127.0.0.1:6379> set mykey 'test expire update' OK redis 127.0.0.1:6379> expire mykey 100 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 95 redis 127.0.0.1:6379> expire mykey 1000 (integer) 1 redis 127.0.0.1:6379> ttl mykey (integer) 998