EXPIRE

语法
EXPIRE key seconds [NX | XX | GT | LT]
自版本起可用
1.0.0
时间复杂度
O(1)
ACL 类别
@keyspace, @write, @fast,

key 设置一个超时时间。超时时间结束后,该键将自动删除。在 Redis 术语中,具有关联超时时间的键通常被称为易失键

只有删除或覆盖键内容的命令才会清除超时时间,包括 DELSETGETSET 和所有 *STORE 命令。这意味着所有概念上更改键中存储的值而不会用新值替换它的操作都会保留超时时间。例如,使用 INCR 增加键的值,使用 LPUSH 将新值推入列表,或使用 HSET 更改哈希的字段值,这些操作都会保留超时时间。

可以使用 PERSIST 命令清除超时时间,使键重新变为持久键。

如果使用 RENAME 重命名键,关联的生存时间将转移到新的键名。

如果使用 RENAME 覆盖键,例如,将现有键 Key_A 覆盖为 RENAME Key_B Key_A 这样的调用,那么原始 Key_A 是否具有关联的超时时间并不重要,新键 Key_A 将继承 Key_B 的所有特征。

请注意,使用非正数超时时间调用 EXPIRE/PEXPIRE 或使用过去的时间调用 EXPIREAT/PEXPIREAT 将导致键被删除 而不是过期(相应地,发出的 键事件 将是 del,而不是 expired)。

选项

EXPIRE 命令支持一组选项

  • NX -- 仅当键没有过期时间时才设置过期时间
  • XX -- 仅当键具有现有过期时间时才设置过期时间
  • GT -- 仅当新的过期时间大于当前过期时间时才设置过期时间
  • LT -- 仅当新的过期时间小于当前过期时间时才设置过期时间

对于 GTLT,非易失键被视为无限 TTL。GTLTNX 选项是互斥的。

刷新过期时间

可以使用已经设置了过期时间的键作为参数调用 EXPIRE。在这种情况下,键的生存时间将更新为新值。这有许多有用的应用,在下面导航会话模式部分中记录了一个示例。

Redis 2.1.3 之前的差异

在 Redis 2.1.3 之前的版本中,使用更改其值的命令更改具有已设置过期时间的键将导致键被完全删除。这种语义是由于复制层中的限制而需要的,这些限制现在已经修复。

EXPIRE 将返回 0 并且不会更改已设置超时时间的键的超时时间。

示例

SET mykey "Hello" EXPIRE mykey 10 TTL mykey SET mykey "Hello World" TTL mykey EXPIRE mykey 10 XX TTL mykey EXPIRE mykey 10 NX TTL mykey

模式:导航会话

假设您有一个 Web 服务,并且您对用户最近访问的最新 N 个页面感兴趣,这样每个相邻的页面浏览都在前一次浏览后的 60 秒内完成。从概念上讲,您可能将此页面浏览集视为用户的导航会话,其中可能包含有关他或她目前正在寻找哪些产品的有趣信息,以便您可以推荐相关的产品。

您可以使用以下策略轻松地用 Redis 模仿此模式:每次用户执行页面浏览时,您都会调用以下命令

MULTI
RPUSH pagewviews.user:<userid> https://.....
EXPIRE pagewviews.user:<userid> 60
EXEC

如果用户在超过 60 秒的时间内处于空闲状态,该键将被删除,并且只有后续在 60 秒时间差内的页面浏览才会被记录。

此模式很容易修改为使用 INCR 来使用计数器,而不是使用 RPUSH 来使用列表。

附录:Redis 过期时间

具有过期时间的键

通常,Redis 键是在没有关联生存时间的情况下创建的。键将永远存在,除非用户以显式方式将其删除,例如使用 DEL 命令。

EXPIRE 命令族能够将过期时间与给定键关联起来,但需要键使用一些额外的内存。当键设置了过期时间后,Redis 会确保在指定的时间过去后删除该键。

可以使用 EXPIREPERSIST 命令(或其他密切相关的命令)来更新或完全删除键的生存时间。

过期时间准确性

在 Redis 2.4 中,过期时间可能不是精确的,可能会有 0 到 1 秒的误差。

从 Redis 2.6 开始,过期时间的误差在 0 到 1 毫秒之间。

过期时间和持久化

键过期信息存储为绝对 Unix 时间戳(在 Redis 版本 2.6 或更高版本中以毫秒为单位)。这意味着即使 Redis 实例处于非活动状态,时间也会流逝。

为了使过期时间正常工作,计算机时间必须保持稳定。如果您将 RDB 文件从两台时钟严重不同步的计算机之间移动,可能会发生奇怪的事情(例如,在加载时所有加载的键都会过期)。

即使是正在运行的实例也会始终检查计算机时钟,因此,例如,如果您设置一个键的生存时间为 1000 秒,然后将计算机时间设置为未来 2000 秒,该键将立即过期,而不是持续 1000 秒。

Redis 如何过期键

Redis 键以两种方式过期:被动方式和主动方式。

当客户端尝试访问键并且键已超时时,键会被动地过期。

但是,这还不够,因为有些已过期的键将永远不会再被访问。这些键应该无论如何过期,所以 Redis 会定期在所有带有过期时间的键集中随机测试一些键。所有已经过期的键都会从键空间中删除。

为了在不牺牲一致性的情况下获得正确的行为,当键过期时,将在 AOF 文件中合成一个 DEL 操作,并将该操作传播给所有连接的副本节点。这样,过期过程就会集中在主实例中,并且不会出现一致性错误。

然而,虽然连接到主节点的副本不会独立地过期键(而是会等待来自主节点的 DEL),但它们仍然会获取数据集中存在的过期时间的完整状态,因此,当副本被选举为主节点时,它将能够独立地过期键,完全像主节点一样工作。

RESP2/RESP3 响应

以下之一

  • 整数响应: 如果未设置超时,则为 0;例如,键不存在,或由于提供的参数而跳过了操作。
  • 整数响应: 如果设置了超时,则为 1

历史

  • 从 Redis 版本 7.0.0 开始:添加了选项:NXXXGTLT
RATE THIS PAGE
Back to top ↑