EXPIRE

Syntax
EXPIRE key seconds [NX | XX | GT | LT]
Available since:
1.0.0
Time complexity:
O(1)
ACL categories:
@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

模式:导航会话

想象一下,你有一个网络服务,并且你对用户最近访问的最新N个页面感兴趣,这些页面之间的访问间隔不超过60秒。从概念上讲,你可以将这组页面访问视为用户的导航会话,其中可能包含有关他或她当前正在寻找的产品的有趣信息,这样你就可以推荐相关产品。

你可以使用以下策略在Redis中轻松模拟这种模式:每次用户进行页面浏览时,你调用以下命令:

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

如果用户空闲超过60秒,密钥将被删除,只有后续页面浏览时间差小于60秒的才会被记录。

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

附录:Redis 过期

带有过期时间的键

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

EXPIRE 系列命令能够为给定的键设置过期时间, 但会消耗一些额外的内存。 当一个键设置了过期时间后,Redis 会在指定的时间过去后确保删除该键。

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

过期准确性

在Redis 2.4中,过期时间可能不是非常精确,可能会有零到一秒的误差。

自 Redis 2.6 起,过期误差为 0 到 1 毫秒。

过期和持久性

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

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

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

Redis 如何使键过期

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

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

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

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

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

RESP2/RESP3 回复

以下之一:

  • Integer reply: 0 如果未设置超时;例如,键不存在,或者由于提供的参数跳过了操作。
  • Integer reply: 1 如果超时已设置。

历史

  • 从Redis版本7.0.0开始:新增选项:NX, XX, GTLT
RATE THIS PAGE
Back to top ↑