expire
EXPIRE
EXPIRE key seconds
自1.0.0起可用。
时间复杂度:
O(1)
设置超时key
。超时过期后,密钥将自动删除。在 Redis 术语中,有关联超时的密钥通常被认为是不稳定的。
超时只能通过删除或覆盖密钥内容的命令清除,包括 DEL,SET,GETSET 和所有*STORE
命令。这意味着所有在概念上改变
存储在密钥中的值而不用新密钥替换的操作都会使超时保持不变。例如,使用 INCR 增加一个键的值,用 LPUSH 将一个新值推入一个列表,或者用 HSET 改变
一个散列的字段值都是会使超时保持不变的操作。
超时也可以被清除,使用 PERSIST 命令将密钥恢复为持久密钥。
如果使用 RENAME 重命名密钥,则相关的生存时间将转移到新的密钥名称。
如果某个密钥被 RENAME 覆盖,就像现有密钥Key_A
被类似的调用覆盖的情况一样RENAME Key_B Key_A
,原始的密码是否与Key_A
超时相关并不重要,新密钥Key_A
将继承所有的特性Key_B
。
请注意,以非积极的超时或 EXPIREAT / PEXPIREAT 调用带有过去时间的 EXPIRE / PEXPIRE 将导致密钥被删除而不是过期(相应地,发出的关键事件将del
不会expired
)。
Refreshing expires
可以使用一个已经存在过期集的键作为参数来调用 EXPIRE。在这种情况下,密钥的生存时间会更新
为新值。有很多有用的应用程序,下面的导航会话
模式部分介绍了一个示例。
Redis之前的差异2.1.3
在2.1.3
之前的 Redis 版本中,使用改变其值的命令更改具有过期集合的密钥具有完全移除密钥的效果。这种语义是需要的,因为现在已经修复了复制层的限制。
EXPIRE 将返回0,并且不会更改设置了超时的密钥的超时。
返回值
整数回复,具体为:
1
如果超时被设置。
0
如果key
不存在。
例子
redis> SET mykey "Hello" "OK" redis> EXPIRE mykey 10 (integer) 1 redis> TTL mykey (integer) 10 redis> SET mykey "Hello World" "OK" redis> TTL mykey (integer) -1
模式:导航会话
想象一下你有一个网络服务,并且你对用户最近
访问过的最近
N个网页感兴趣,这样每个相邻的网页浏览都不会在前一个网页中执行超过60秒。从概念上讲,您可以将这组页面视为用户的导航会话
,可能包含有关他或她当前正在查找的产品的有趣信息,以便推荐相关产品。
您可以使用以下策略轻松在 Redis 中对此模式进行建模:每次用户执行页面视图时,都会调用以下命令:
MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC
如果用户空闲时间超过60秒,则该键将被删除,并且只有小于60秒的后续页面查看才会被记录下来。
这种模式很容易修改为使用 INCR 而不是使用 RPUSH 的列表。
附录:Redis到期
过期的钥匙
通常情况下,Redis 密钥创建时没有关联的生存时间。除非用户以明确的方式删除密钥,例如使用 DEL 命令,否则密钥将永远存在。
EXPIRE 系列命令能够将过期与给定密钥相关联,但需要使用密钥所使用的一些额外内存。当密钥设置过期时,Redis 将确保在指定的时间量过去时移除密钥。
使用 EXPIRE 和 PERSIST 命令(或其他严格相关的命令)可以更新或完全删除生存的关键时刻。
到期准确性
在 Redis 2.4中,expire 可能不是精确的,它可能在0到1秒之间。
由于 Redis 2.6 的过期错误是从0到1毫秒。
过期和持久
密钥过期信息存储为绝对 Unix 时间戳(Redis 版本2.6或更高版本以毫秒为单位)。这意味着即使 Redis 实例未处于活动状态,时间仍在流动。
为了过期工作,电脑的时间必须保持稳定。如果您从两台计算机中移动一个RDB文件并在其时钟中执行大的异步操作,可能会发生有趣的事情(例如加载时所有加载的密钥都会过期)。
即使正在运行的实例也会检查计算机时钟,因此,例如,如果您设置的密钥的生存时间为1000秒,然后将计算机的时间设置为将来2000秒,密钥将立即过期,而不是持续1000秒。
Redis 如何过期密钥
Redis 密钥有两种过期方式:被动方式和主动方式。
当某个客户端试图访问密钥时,密钥被动地过期,并且发现密钥超时。
当然这还不够,因为有过期的密钥永远不会被再次访问。无论如何,这些密钥应该过期,因此 Redis 会定期在密钥中随机测试几个密钥并设置过期。所有已过期的密钥都将从密钥空间中删除。
具体来说,这是 Redis 每秒执行10次的操作:
- 从关键集合中检测20个随机关键字并带有关联的过期。
- 删除所有过期的密钥。
- 如果超过25%的密钥过期,请从第1步重新开始。
这是一个微不足道的概率算法,基本上假设是我们的样本代表了整个密钥空间,并且我们继续过期直到可能过期的密钥的百分比低于25%
这意味着在任何给定时刻,已经过期的使用存储器的最大密钥数量最多等于每秒写入操作的最大数量除以4。
如何在复制链接和AOF文件中处理过期
为了在不牺牲一致性的情况下获得正确的行为,当密钥过期时,将在 AOF 文件中合成一个 DEL 操作并获取所有连接的从站。这样,到期过程集中在主实例中,并且不存在一致性错误的可能性。
然而,虽然连接到主服务器的从服务器不会独立使用密钥(但会等待来自主服务器的 DEL),但它们仍会采用数据集中存在的已满过期的完整状态,因此,当从服务器选择为掌握它将能够独立过期,完全充当主人。