扫描不删除redis中的过期键
scan does not delete expired keys in redis
我有一些键在 redis 中过期了。我在我的应用程序中使用 EXISTS
检查它们,然后根据其输出做出决定。
当它们到达到期时间时,TTL
命令,returns -1
,但它们不会从 redis 中删除并且 EXISTS
命令仍然 returns 1
为他们;我的应用假定它们尚未过期。
但是,由于我意识到一旦有人尝试使用 SCAN
或类似命令访问这些密钥,这些密钥就会被删除,因此我尝试这样做。我在我的密钥上使用了 SCAN
,但它没有删除我的密钥。
是否有任何命令可以检查密钥是否未过期?仅当以下两个条件都为真时 returns 1
的命令:
- redis中存在key
- 有效期为正
在 Redis 2.6 或更早版本中,TTL 命令 returns -1
如果键不存在或者键存在但没有关联的过期时间。
从 Redis 2.8 开始,发生错误时的 return 值已更改:
- 命令returns
-2
如果密钥不存在。
- 命令 returns
-1
如果密钥存在但没有关联过期。
因此,在您的情况下,您的密钥存在,但它们没有关联的过期时间。实际上,您正在使用对密钥执行的 EXISTS
命令访问密钥,但它们没有过期 - 因此它们没有过期。
所以你需要为这些键设置过期时间,然后它们会主动过期(当你访问它们时)或被动过期(使用 redis 的过期算法 运行 在幕后)
我有一些键在 redis 中过期了。我在我的应用程序中使用 EXISTS
检查它们,然后根据其输出做出决定。
当它们到达到期时间时,TTL
命令,returns -1
,但它们不会从 redis 中删除并且 EXISTS
命令仍然 returns 1
为他们;我的应用假定它们尚未过期。
但是,由于我意识到一旦有人尝试使用 SCAN
或类似命令访问这些密钥,这些密钥就会被删除,因此我尝试这样做。我在我的密钥上使用了 SCAN
,但它没有删除我的密钥。
是否有任何命令可以检查密钥是否未过期?仅当以下两个条件都为真时 returns 1
的命令:
- redis中存在key
- 有效期为正
在 Redis 2.6 或更早版本中,TTL 命令 returns -1
如果键不存在或者键存在但没有关联的过期时间。
从 Redis 2.8 开始,发生错误时的 return 值已更改:
- 命令returns
-2
如果密钥不存在。 - 命令 returns
-1
如果密钥存在但没有关联过期。
因此,在您的情况下,您的密钥存在,但它们没有关联的过期时间。实际上,您正在使用对密钥执行的 EXISTS
命令访问密钥,但它们没有过期 - 因此它们没有过期。
所以你需要为这些键设置过期时间,然后它们会主动过期(当你访问它们时)或被动过期(使用 redis 的过期算法 运行 在幕后)