将数据写入 Redis 时,有时数据可能不再需要。我们可以使用 DEL 显式删除数据,或者如果我们想在指定的超时后删除整个键,我们可以使用所谓的 过期 机制。当我们说一个键有一个 存活时间(time to live),或者它将在给定时间 过期 时,意味着 Redis 会在键的过期时间到达时自动删除该键。
设置键在一段时间后过期,对于处理缓存数据的清理很有用。如果你阅读其他章节,会发现 Redis 中不常使用键过期(除了 6.2、7.1 和 7.2 节)。这主要是由于所使用的数据结构类型;我们使用的命令中很少有能自动设置键的过期时间。对于容器 (LIST、SET、HASH 和 ZSET),我们只能使整个键过期,而不能使单个项过期(这也是为什么我们在一些地方使用带有时间戳的 ZSET)。
在本节中,我们将介绍用于在指定的超时后或在指定时间自动使 Redis 中的键过期和删除键的命令。阅读本节后,您将能够使用过期机制来降低 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 及更高版本中可用) |
您可以在下一个清单中看到一些在键上使用过期时间的示例。
>>> 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
我们也可以轻松地查明一个键多久后会过期。
在 2.1、2.2 和 2.5 节中,我们使用了带有时间戳的 ZSET 来保存会话 ID 列表以便清理。通过使用这个 ZSET,我们可以在清理会话时选择性地对我们的项目进行分析。但是,如果我们不关心分析,我们可以通过过期机制获得相似的语义,而无需清理函数。您能否更新 update_token() 和 add_to_cart() 函数,使其使用过期机制而不是使用“最近” ZSET 和清理函数来使键过期?