在项目实际开发中经常遇到一些业务场景,有些数据具有时效性。
如果存在关系型数据库里面,需要新增一个字段存储时间,与当前时间进行比较是否有效。
Redis 可以通过expire
命令,直接设置数据的时效性。
示例:
127.0.0.1:6379> set name vila
OK
127.0.0.1:6379> get name
"vila"
127.0.0.1:6379> expire name 15
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> expire name 10
(integer) 0
在上面命令中,我设置了,name有效性为15秒,执行expire name 15
命令之后返回 1表示命令执行成功,返回0表示键不存在或者设置失败。15秒之后,我获取键值就获取不到了。
__ 查询一个键有效的剩余时间__
在设置了一个键的有效期之后,我们可以通过命令ttl
查看键的剩余时间
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> get name vilay
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> get name
"vilay"
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> ttl name
(integer) 17
127.0.0.1:6379> ttl name
(integer) 14
127.0.0.1:6379> ttl name
(integer) -2
当键不存在时,返回-2
如果没有为键设置有效期呢,返回啥?
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> ttl name
(integer) -1
返回-1表示没有为该键设置有效时间。
取消键有效时间设置
对一个键设置了有效时间,如果需要取消,可以使用persist
命令,或者set/getset(设置值并返回值)。
示例:
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl name
(integer) 13
127.0.0.1:6379> persist name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> ttl name
(integer) 18
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> ttl name
(integer) -1
当对键使用persist 或者重新set的时候,有效时间就无效了。
getset 示例:
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl name
(integer) 16
127.0.0.1:6379> getset name vilay
"vilay"
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl name
(integer) -1
其它对键值操作的命令并不会改变键的有效期(lpush,incr,hset,zrem)等。
expire 设置的是秒数,值必须为整数,也就是说过期时间的最小单位就是秒。
watch 监控设置了过期时间的键,时间到了值自动销毁,watch并不会觉得值改变了。
示例:
127.0.0.1:6379> set name vilay
OK
127.0.0.1:6379> get name vilay
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> get name
"vilay"
127.0.0.1:6379> expire name 60
(integer) 1
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl name
(integer) 54
127.0.0.1:6379> watch name
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set haha jz
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get haha
"jz"
127.0.0.1:6379> get name
(nil)
还有两个设置过期时间命令:expireat,pexpireat
expireat是以unix时间戳作为第二个参数。
pexpireat 则是以毫秒为单位。