扫描不删除redis中的过期键

scan does not delete expired keys in redis

我有一些键在 redis 中过期了。我在我的应用程序中使用 EXISTS 检查它们,然后根据其输出做出决定。

当它们到达到期时间时,TTL 命令,returns -1,但它们不会从 redis 中删除并且 EXISTS 命令仍然 returns 1 为他们;我的应用假定它们尚未过期。

但是,由于我意识到一旦有人尝试使用 SCAN 或类似命令访问这些密钥,这些密钥就会被删除,因此我尝试这样做。我在我的密钥上使用了 SCAN,但它没有删除我的密钥。

是否有任何命令可以检查密钥是否未过期?仅当以下两个条件都为真时 returns 1 的命令:

  1. redis中存在key
  2. 有效期为正

在 Redis 2.6 或更早版本中,TTL 命令 returns -1 如果键不存在或者键存在但没有关联的过期时间。

从 Redis 2.8 开始,发生错误时的 return 值已更改:

  • 命令returns -2如果密钥不存在。
  • 命令 returns -1 如果密钥存在但没有关联过期。

因此,在您的情况下,您的密钥存在,但它们没有关联的过期时间。实际上,您正在使用对密钥执行的 EXISTS 命令访问密钥,但它们没有过期 - 因此它们没有过期。

所以你需要为这些键设置过期时间,然后它们会主动过期(当你访问它们时)或被动过期(使用 redis 的过期算法 运行 在幕后)