dot Redis 8 来了——而且它是开源的

了解更多

3.7.3 键过期

返回主页

3.7.3 键过期

将数据写入 Redis 时,有时数据可能不再需要。我们可以使用 DEL 显式删除数据,或者如果我们想在指定的超时后删除整个键,我们可以使用所谓的 过期 机制。当我们说一个键有一个 存活时间(time to live),或者它将在给定时间 过期 时,意味着 Redis 会在键的过期时间到达时自动删除该键。

设置键在一段时间后过期,对于处理缓存数据的清理很有用。如果你阅读其他章节,会发现 Redis 中不常使用键过期(除了 6.2、7.1 和 7.2 节)。这主要是由于所使用的数据结构类型;我们使用的命令中很少有能自动设置键的过期时间。对于容器 (LISTSETHASHZSET),我们只能使整个键过期,而不能使单个项过期(这也是为什么我们在一些地方使用带有时间戳的 ZSET)。

在本节中,我们将介绍用于在指定的超时后或在指定时间自动使 Redis 中的键过期和删除键的命令。阅读本节后,您将能够使用过期机制来降低 Redis 内存使用,并清理不再需要的数据。

表 3.13 显示了我们在 Redis 中用于设置和检查键过期时间的命令列表。

表 3.13 处理 Redis 中过期的命令
命令 使用示例和说明
PERSIST PERSIST key-name — 移除键的过期时间
TTL TTL key-name — 返回键过期前剩余的时间
EXPIRE EXPIRE key-name seconds — 将键设置为在给定秒数后过期
EXPIREAT EXPIREAT key-name timestamp — 将过期时间设置为给定的 Unix 时间戳
PTTL PTTL key-name — 返回键过期前的毫秒数(在 Redis 2.6 及更高版本中可用)
PEXPIRE PEXPIRE key-name milliseconds — 将键设置为在给定毫秒数后过期(在 Redis 2.6 及更高版本中可用)
PEXPIREAT PEXPIREAT key-name timestamp-milliseconds — 将过期时间设置为以毫秒为单位的给定 Unix 时间戳(在 Redis 2.6 及更高版本中可用)

您可以在下一个清单中看到一些在键上使用过期时间的示例。

清单 3.15 显示 Redis 中过期相关命令用法的示例交互
>>> conn.set('key', 'value')
True
>>> conn.get('key')
'value'

我们从一个非常简单的 STRING 值开始。

>>> conn.expire('key', 2)
True
>>> time.sleep(2)
>>> conn.get('key')

如果我们设置一个键在未来过期,并等待足够长的时间直到键过期,当我们尝试获取该键时,它已经被删除了。

>>> conn.set('key', 'value2')
True
>>> conn.expire('key', 100); conn.ttl('key')
True
100

我们也可以轻松地查明一个键多久后会过期。

练习:用 EXPIRE 替换带时间戳的 ZSET

在 2.1、2.2 和 2.5 节中,我们使用了带有时间戳的 ZSET 来保存会话 ID 列表以便清理。通过使用这个 ZSET,我们可以在清理会话时选择性地对我们的项目进行分析。但是,如果我们不关心分析,我们可以通过过期机制获得相似的语义,而无需清理函数。您能否更新 update_token()add_to_cart() 函数,使其使用过期机制而不是使用“最近” ZSET 和清理函数来使键过期?