源地址:https://www.digitalocean.com/community/cheatsheets/how-to-expire-keys-in-redis
作者:Mark Drake
简介
Redis 是一个开源的、运行在内存中的键值数据库。Redis keys 默认是 persistent(持久化)的,意味着 Redis 服务器将会一直存储它们,除非它们被手动删除。然而,可能会有这样的情况:你设置了一个 key,但是你知道你会想在一段时间后删除它;换句话说,你想要一个 volatile(译者注:易挥发,这里指会过期)的 key。
本教程介绍了如何设置键值对过期、检查键值对过期的剩余时间以及取消键值对的过期设置。
如何使用这个教程
这个教程是以小抄(Cheat Sheet)的形式写的,有对应的例子。我们鼓励你直接跳转到和你要完成的任务相关的章节进行阅读。
这个教程中的命令在 Ubuntu 18.04 中的 Redis 4.0.9 版本完成测试。如果你需要建设一个同样的环境,可以参考我们的 如何在 Ubuntu 18.04 上安装并加固 Redis 中的 Step 1 来安装 Redis。我们将通过 Redis 命令行界面redis-cli
运行这些命令,来演示这些命令的行为。请注意,如果你使用不同的 Redis 工具--例如Redli —— 某些命令的实际输出可能有所不同。
此外,你还可以使用一个代管的 Redis 数据库实例来测试这些命令。但需要注意的是,根据你的数据库服务提供商的限制,这个教程中的某些命令可能运行效果和教程不一致。如果想要使用 DigitalOcean 提供的代管数据库,可以查看我们的代管数据库产品文档。使用代管 Redis 数据库实例时,你必须安装 Redli或设置 TLS 隧道 来通过 TLS 链接到代管数据库。
设定 Key 的过期时间
您可以使用 expire
命令为现有键设置过期时间,该命令将密钥的名称和过期所需的秒数作为参数。你需要运行以下两个命令,第一个创建一个名为 key_melon
的字符串键,其值为 "cantaloupe"
,第二个将其设置为在 450 秒后过期:
127.0.0.1:6379> set key_melon "cantaloupe"
127.0.0.1:6379> expire key_melon 450
如果超时设置成功,expire
命令将返回 (integer) 1
。如果设置超时失败,它将改为返回 (integer) 0
。
或者,您可以使用 expireat
命令将密钥设置为在特定时间点过期。它采用 Unix timestamp 作为参数,而不是到期前的秒数。Unix 时间戳是自 _Unix 纪元_或 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。有许多在线工具可用于查找特定日期和时间的 Unix 时间戳,例如 EpochConverter 或 UnixTimestamp.com。
例如,要将 key_melon
设置为 2025 年 5 月 1 日 GMT 时间晚上 8:30 到期(由 Unix 时间戳 1746131400
表示),您可以使用以下命令:
127.0.0.1:6379> expireat key_melon 1746131400
请注意,如果您传递给 expireat
的时间戳已经发生,它将立即删除密钥。
检查键值对的过期时间
每当您将密钥设置为过期时,您都可以使用 ttl
检查过期的剩余时间(以秒为单位),它代表“time to live”:
127.0.0.1:6379> ttl key_melon
输出
(integer) 433
要获得更详细的信息,您可以运行 pttl
,它将返回密钥过期前的时间量(以毫秒为单位):
127.0.0.1:6379> pttl key_melon
输出
(integer) 431506
如果密钥未设置为过期,ttl
和 pttl
都将返回 (integer) -1
,如果密钥不存在则返回 (integer) -2
。
持久化键值对
如果键已设置为可过期,则任何覆盖键内容的命令(如set
或 getset
)都将清除键的超时值。要手动清除密钥的超时,请使用 persist
命令:
127.0.0.1:6379> persist key_melon
如果成功完成,persist
命令将返回 (integer) 1
,表示密钥将不再过期。
总结
本指南详细介绍了一些用于在 Redis 中操作和检查密钥持久性的命令。