到期
EXPIRE key seconds [NX | XX | GT | LT]
- 适用日期:
- 1.0.0
- 时间复杂度:
- (1)
- ACL 类别:
-
@keyspace,,@write@fast,
设置超时key。超时到期后,密钥将自动被删除。在 Redis 术语中,具有相关超时的密钥通常被称为易失性密钥。
只有删除或覆盖键内容的命令(包括DEL、SET和GETSET所有*STORE
命令)才能清除超时。这意味着,所有从概念上改变存储在键中的值而不将其替换为新值的操作都不会影响超时。例如,使用 增加键的值INCR、使用 将新值推送到列表中LPUSH或使用 更改哈希的字段值HSET都是不会影响超时的操作。
还可以使用命令清除超时,将密钥重新变为持久密钥PERSIST。
如果将密钥重命名为RENAME,则相关的生存时间将转移到新的密钥名称。
如果某个密钥被 覆盖,例如现有密钥
被 之类的调用覆盖的RENAME情况,那么无论原始密钥是否具有相关的超时,新密钥都会继承 的所有特征。Key_ARENAME Key_B Key_AKey_AKey_AKey_B
请注意,使用非正超时或
使用过去的时间
调用EXPIRE/将导致密钥被删除而不是过期(因此,发出的密钥事件
将是,而不是)。PEXPIREEXPIREATPEXPIREATdelexpired
选项
该EXPIRE命令支持一组选项:
NX-- 仅当密钥没有到期时才设置到期时间XX-- 仅当密钥已有到期时间时才设置到期时间GT-- 仅当新到期时间大于当前到期时间时才设置到期时间LT-- 仅当新到期时间小于当前到期时间时才设置到期时间
对于GT和而言,非易失性密钥被视为无限 TTL LT。GT、LT和NX选项是互斥的。
刷新已过期
可以EXPIRE使用已设置到期时间的键作为参数进行调用。在这种情况下,键的生存时间将更新为新值。这有很多有用的应用,下面的导航会话模式部分记录了一个示例
。
Redis 2.1.3 之前的版本中的差异
在 Redis 2.1.3之前的版本中,使用命令更改键的值并设置过期时间会导致整个键被删除。之所以需要这种语义,是因为复制层存在一些限制,但现在已经修复。
EXPIRE将返回 0 并且不会改变已设置超时的键的超时时间。
示例
模式:导航会话
假设您有一个 Web 服务,并且您对用户最近访问的最新 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可以使用and
PERSIST命令(或其他严格相关的命令)更新或完全删除密钥生存时间。
到期准确性
在 Redis 2.4 中,过期时间可能不是十分准确,可能相差零到一秒之间。
从 Redis 2.6 开始,过期错误为 0 到 1 毫秒。
过期和持久性
密钥过期信息以绝对 Unix 时间戳的形式存储(Redis 2.6 或更高版本以毫秒为单位)。这意味着即使 Redis 实例不活跃,时间也会流动。
要使过期功能正常工作,计算机时间必须保持稳定。如果您从两台时钟严重不同步的计算机移动 RDB 文件,可能会发生奇怪的事情(例如,加载的所有密钥在加载时都过期)。
即使正在运行的实例也将始终检查计算机时钟,因此例如如果您设置一个生存时间为 1000 秒的密钥,然后将计算机时间设置为未来的 2000 秒,则该密钥将立即过期,而不是持续 1000 秒。
Redis 如何使密钥过期
Redis 密钥过期的方式有两种:被动方式和主动方式。
当客户端尝试访问密钥并且该密钥已超时时,该密钥将被动过期。
但是,这还不够,因为有些过期的键永远不会再被访问。这些键无论如何都应该过期,因此 Redis 会定期在具有过期时间的键集中随机测试几个键。所有已过期的键都会从键空间中删除。
复制链接和 AOF 文件中如何处理过期
为了在不牺牲一致性的情况下获得正确的行为,当某个键过期时,DEL会在 AOF 文件中合成一个操作并获得所有附加的副本节点。这样,过期过程就集中在主实例中,并且不会出现一致性错误。
但是,虽然连接到主服务器的副本不会独立地使密钥过期(但会等待DEL来自主服务器的消息),但它们仍将采用数据集中现有的过期完整状态,因此当副本被选为主服务器时,它将能够独立地使密钥过期,完全充当主服务器。
RESP2/RESP3 回复
以下之一:
历史
- 从 Redis 版本 7.0.0 开始:添加了选项:
NX、XX和。GTLT