EXPIRE
EXPIRE key seconds [NX | XX | GT | LT]
- 自版本起可用
- 1.0.0
- 时间复杂度
- O(1)
- ACL 类别
-
@keyspace
,@write
,@fast
,
为 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
)。
选项
EXPIRE
命令支持一组选项
NX
-- 仅当键没有过期时间时才设置过期时间XX
-- 仅当键具有现有过期时间时才设置过期时间GT
-- 仅当新的过期时间大于当前过期时间时才设置过期时间LT
-- 仅当新的过期时间小于当前过期时间时才设置过期时间
对于 GT
和 LT
,非易失键被视为无限 TTL。GT
、LT
和 NX
选项是互斥的。
刷新过期时间
可以使用已经设置了过期时间的键作为参数调用 EXPIRE
。在这种情况下,键的生存时间将更新为新值。这有许多有用的应用,在下面导航会话模式部分中记录了一个示例。
Redis 2.1.3 之前的差异
在 Redis 2.1.3 之前的版本中,使用更改其值的命令更改具有已设置过期时间的键将导致键被完全删除。这种语义是由于复制层中的限制而需要的,这些限制现在已经修复。
EXPIRE
将返回 0 并且不会更改已设置超时时间的键的超时时间。
示例
模式:导航会话
假设您有一个 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 会确保在指定的时间过去后删除该键。
可以使用 EXPIRE
和 PERSIST
命令(或其他密切相关的命令)来更新或完全删除键的生存时间。
过期时间准确性
在 Redis 2.4 中,过期时间可能不是精确的,可能会有 0 到 1 秒的误差。
从 Redis 2.6 开始,过期时间的误差在 0 到 1 毫秒之间。
过期时间和持久化
键过期信息存储为绝对 Unix 时间戳(在 Redis 版本 2.6 或更高版本中以毫秒为单位)。这意味着即使 Redis 实例处于非活动状态,时间也会流逝。
为了使过期时间正常工作,计算机时间必须保持稳定。如果您将 RDB 文件从两台时钟严重不同步的计算机之间移动,可能会发生奇怪的事情(例如,在加载时所有加载的键都会过期)。
即使是正在运行的实例也会始终检查计算机时钟,因此,例如,如果您设置一个键的生存时间为 1000 秒,然后将计算机时间设置为未来 2000 秒,该键将立即过期,而不是持续 1000 秒。
Redis 如何过期键
Redis 键以两种方式过期:被动方式和主动方式。
当客户端尝试访问键并且键已超时时,键会被动地过期。
但是,这还不够,因为有些已过期的键将永远不会再被访问。这些键应该无论如何过期,所以 Redis 会定期在所有带有过期时间的键集中随机测试一些键。所有已经过期的键都会从键空间中删除。
在复制链接和 AOF 文件中如何处理过期时间
为了在不牺牲一致性的情况下获得正确的行为,当键过期时,将在 AOF 文件中合成一个 DEL
操作,并将该操作传播给所有连接的副本节点。这样,过期过程就会集中在主实例中,并且不会出现一致性错误。
然而,虽然连接到主节点的副本不会独立地过期键(而是会等待来自主节点的 DEL
),但它们仍然会获取数据集中存在的过期时间的完整状态,因此,当副本被选举为主节点时,它将能够独立地过期键,完全像主节点一样工作。
RESP2/RESP3 响应
以下之一
历史
- 从 Redis 版本 7.0.0 开始:添加了选项:
NX
、XX
、GT
和LT
。