EXPIRE

设置键的过期时间(以秒为单位)。

语法

EXPIRE key seconds [NX | XX | GT | LT]

引入版本: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 的所有特性。

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

必需参数

key

键名称。

seconds

生存时间,以秒为单位。过了这么多秒后,该键就会被删除。

可选参数

这些选项是相互排斥的。

NX

仅当键没有有效期时才设置有效期。

XX

仅当键已经过期时才设置过期时间。

GT

仅当新的到期时间大于当前的到期时间时才设置到期时间。出于 GT 的目的,非易失性键被视为无限 TTL。

LT

仅当新的到期时间小于当前的到期时间时才设置到期时间。出于 LT 的目的,非易失性键被视为无限 TTL。

示例

> SET mykey "Hello"
OK
> EXPIRE mykey 10
(integer) 1
> TTL mykey
(integer) 10
> SET mykey "Hello World"
OK
> TTL mykey
(integer) -1
> EXPIRE mykey 10 XX
(integer) 0
> TTL mykey
(integer) -1
> EXPIRE mykey 10 NX
(integer) 1
> TTL mykey
(integer) 10

详细说明

刷新过期

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

Redis 2.1.3之前的差异

在 2.1.3 之前的 Redis 版本中,使用更改其值的命令来更改设置了过期时间的键会产生完全删除该键的效果。由于复制层的限制现已修复,因此需要这种语义。

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 和 PERSIST 命令(或其他严格相关的命令)更新或完全删除关键生存时间。

过期准确率

在 Redis 2.4 中,过期时间可能不精确,可能会在零到一秒之间。

从 Redis 2.6 开始,过期错误从 0 到 1 毫秒。

过期和持久化

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

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

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

Redis 如何使键过期

Redis key 过期有两种方式:被动方式和主动方式。

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

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

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

然而,虽然连接到主服务器的副本不会独立使键过期(但会等待来自主服务器的 DEL),但它们仍然会获取数据集中现有的过期状态的完整状态,因此当副本被选为主服务器时,它将能够独立使键过期,完全充当主服务器。

Redis搜索和过期

从 Redis 8 开始,Redis 搜索在处理过期键时增强了行为。有关 FT.SEARCH 和 FT.AGGREGATE 命令如何与过期键交互的详细信息,请参阅 键和字段过期行为。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

以下之一: * 整数回复:如果未设置超时,则为 0;例如,键不存在,或者由于提供的参数而跳过操作。 * 整数回复: 1(如果设置了超时)。

RESP3

以下之一: * 整数回复:如果未设置超时,则为 0;例如,键不存在,或者由于提供的参数而跳过操作。 * 整数回复: 1(如果设置了超时)。

资料来源:Redis 官方 EXPIRE 文档;中文内容参考 Redis 文档许可。