暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(12):TTL、EXPIRE和EXPIREAT命令

原创 AlbertS 2019-12-12
5028

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

今天继续来看有关于keys的命令,记得之前在学习 SETEX 命令的时候说过,这个命令可以在设置键对应的值的同时指定过期时间,如果设置过期时间是5秒,那么5秒内这个键是有效的,超过5秒键被删除,当时测试的时候还等了5秒看结果,今天学了这几个命令之后,可以直接修改和查询键的过期时间,一起来看下吧。

TTL

  • 最早出现版本:1.0.0
  • 时间复杂度:O(1)
  • 命令参数:TTL key
  • 操作类型:keys
  • 官方文档

作用

查询一个键的过期剩余时间,在Redis中如果键过期了会被直接删掉,这个命令返回的过期时间单位是秒,从2.8版本开始,如果指定的键不存在返回-2,如果指定的键存在但是不会过期,那么返回-1,这两种情况在2.6版本及之前都是返回-1的。

练习

先查看一个不会过期的键的剩余有效时间:

127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> TTL name
(integer) -1
127.0.0.1:6379>

再查询一个会过期的键,有效期内查一次,过了有效期查一次,先指定有效期时间为8秒:

127.0.0.1:6379> SETEX age 8 18
OK
127.0.0.1:6379> TTL age
(integer) 6
127.0.0.1:6379> TTL age
(integer) 3
127.0.0.1:6379> TTL age
(integer) -2
127.0.0.1:6379> GET age
(nil)
127.0.0.1:6379>

EXPIRE

  • 最早出现版本:1.0.0
  • 时间复杂度:O(1)
  • 命令参数:EXPIRE key seconds
  • 操作类型:keys
  • 官方文档

作用

设置一个键的过期时间,指定成功返回1,指定的键不存在返回0,如果指定的数字是负数,则这个键会直接删除,键的过期时间可以在重新设置是被覆盖和重置,比如用 EXPIRE 命令设置了过期时间,但是在用 SET 命令设置就可以变成永久不过期的,当使用 rename 命令时,新的键会继承旧键的过期时间。

练习

对一个永久的键设置过期时间,查询后再使用 SET 命令覆盖过期时间,然后设置过期时间为负数,直接将键删除:

127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> TTL name
(integer) -1
127.0.0.1:6379> EXPIRE name 60
(integer) 1
127.0.0.1:6379> TTL name
(integer) 55
127.0.0.1:6379> SET name tom
OK
127.0.0.1:6379> TTL name
(integer) -1
127.0.0.1:6379> GET name
"tom"
127.0.0.1:6379> EXPIRE name -1
(integer) 1
127.0.0.1:6379> GET name
(nil)
127.0.0.1:6379>

EXPIREAT

  • 最早出现版本:1.2.0
  • 时间复杂度:O(1)
  • 命令参数:EXPIREAT key timestamp
  • 操作类型:keys
  • 官方文档

作用

同样是设置一个键的过期时间,只不过参数不是秒数,而是一个时间戳,关于时间戳首先需要了解,以秒为单位的时间戳是指,从1970年1月1日00:00:00那一刻开始到当前时间的秒数就是时间戳,如果想指定一个键在2020年1月1日00:00:00过期,既可以将那一刻对应的时间戳作为参数使用,那么当 Redis运行到那一个时,现在指定的这个键就被删除了。

练习

先查询一下今天凌晨的时间戳(北京时间2019-12-03 00:00:00),时间戳应该是1575302400,设置一个键在凌晨过期,看一下测试结果

27.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> EXPIREAT name 1575302400
(integer) 1
127.0.0.1:6379> TTL name
(integer) 11914
127.0.0.1:6379>

查询剩余的过期时间还有11914秒,大概3个小时,现在的时间是(北京时间)2019-12-2 20:42:35,这样来算是没有问题的。

总结

  1. TTL 命令应该是 Time To Live 的缩写,返回一个键的剩余过期时间,单位是秒,不存在返回-2,不会过期返回-1。
  2. EXPIRE 命令可以设置一个键的过期时间,单位是秒,成功设置返回1,键不存在返回0。
  3. EPIPIREAT 命令同样可以设置键的过期时间,但是参数是过期的时间点,也就是代表那个时间点的时间戳。

2019-12-2 20:46:46

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论