在项目实际开发中经常遇到一些业务场景,有些数据具有时效性。

如果存在关系型数据库里面,需要新增一个字段存储时间,与当前时间进行比较是否有效。

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 则是以毫秒为单位。