07-命令介绍
4.2.1 命令介绍
在2.6版中,无论键不存在还是键没有过期时间都会返回
− 1
,直到2.8版后两种情况才会分别返回−2
和−1
两种结果。
在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。在关系数据库中一般需要额外的一个字段记录到期时间,然后定期检测删除过期数据。而在Redis中可以使用 EXPIRE
命令设置一个键的过期时间,到时间后Redis会自动删除它。
(integer) –1
EXPIRE
命令的使用方法为 EXPIRE key seconds
,其中 seconds
参数表示键的过期时间,单位是秒。如要想让 session:29e3d
键在15分钟后被删除:
redis> SET session:29e3d uid1314 OK
redis> EXPIRE session:29e3d 900 (integer) 1
EXPIRE
命令返回1表示设置成功,返回0则表示键不存在或设置失败。例如:
redis> DEL session:29e3d (integer) 1
redis> EXPIRE session:29e3d 900 (integer) 0
如果想知道一个键还有多久的时间会被删除,可以使用 TTL
命令。返回值是键的剩余时间(单位是秒):
redis> SET foo bar OK
redis> EXPIRE foo 20 (integer) 1
redis> TTL foo (integer) 15
redis> TTL foo (integer) 7
redis> TTL foo (integer) –2
可见随着时间的不同, foo
键的过期时间逐渐减少,20秒后 foo
键会被删除。当键不存在时 TTL
命令会返回 − 2
。
那么没有为键设置过期时间(即永久存在,这是建立一个键后的默认情况)的情况下会返回什么呢?答案是返回 − 1
:
redis> SET persistKey value OK
redis> TTL persistKey
版本差异
如果想取消键的过期时间设置(即将键恢复成永久的),则可以使用 PERSIST
命令。如果过期时间被成功清除则返回 1
;否则返回 0
(因为键不存在或键本来就是永久的):
redis> SET foo bar OK
redis> EXPIRE foo 20 (integer) 1
redis> PERSIST foo (integer) 1
redis> TTL foo (integer) –1
除了 PERSIST
命令之外,使用 SET
或 GETSET
命令为键赋值也会同时清除键的过期时间,例如:
redis> EXPIRE foo 20 (integer) 1
redis> SET foo bar OK
redis> TTL foo (integer) –1
使用 EXPIRE
命令会重新设置键的过期时间,就像这样:
redis> SET foo bar OK
redis> EXPIRE foo 20 (integer) 1
redis> TTL foo (integer) 15
redis> EXPIRE foo 20 (integer) 1
redis> TTL foo (integer) 17
其他只对键值进行操作的命令(如 INCR
、 LPUSH
、 HSET
、 ZREM
)均不会影响键的过期时间。
EXPIRE
命令的 seconds
参数必须是整数,所以最小单位是1秒。如果想要更精确的控制键的过期时间应该使用 PEXPIRE
命令, PEXPIRE
命令与 EXPIRE
的唯一区别是前者的时间单位是毫秒,即 PEXPIRE key 1000
与 EXPIRE key 1
等价。对应地可以用 PTTL
命令以毫秒为单位返回键的剩余时间。
提示
如果使用
WATCH
命令监测了一个拥有过期时间的键,该键时间到期自动删除并不会被WATCH
命令认为该键被改变。
另外还有两个相对不太常用的命令: EXPIREAT
和 PEXPIREAT
。
EXPIREAT
命令与 EXPIRE
命令的差别在于前者使用Unix时间作为第二个参数表示键的过期时刻。 PEXPIREAT
命令与 EXPIREAT
命令的区别是前者的时间单位是毫秒。如:
redis> SET foo bar OK
redis> EXPIREAT foo 1351858600 (integer) 1
redis> TTL foo (integer) 142
redis> PEXPIREAT foo 1351858700000 (integer) 1