源地址: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 时间戳,例如 EpochConverterUnixTimestamp.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

如果密钥未设置为过期,ttlpttl 都将返回 (integer) -1,如果密钥不存在则返回 (integer) -2

持久化键值对

如果键已设置为可过期,则任何覆盖键内容的命令(如setgetset )都将清除键的超时值。要手动清除密钥的超时,请使用 persist 命令:

127.0.0.1:6379>  persist key_melon

如果成功完成,persist 命令将返回 (integer) 1,表示密钥将不再过期。

总结

本指南详细介绍了一些用于在 Redis 中操作和检查密钥持久性的命令。