Redis 和“setex 中的过期时间无效”

Redis 和“setex 中的过期时间无效”

我们运行一个 Python (Django) 应用程序,该应用程序将数据临时存储在 Redis 中。但有时,当数据存储到 Redis 中时,数据已经过期,因此会调用 setex,并将过期时间设置为 <= 0。

有没有办法让 Redis 默默地丢弃这样的 setex 命令而不公开抱怨:

 ResponseError: invalid expire time in setex

目前我无法通过应用程序执行此操作。

答案1

Django 有很好的原语来处理这种情况。只需将 redis 设置为您的缓存之一,并使用 cachr.set 方法设置从存储时间开始的 n 秒的过期时间。

答案2

您可以编写一个 LUA 脚本来实现这一点。

将密钥名称作为 KEYS 发送,将值字符串和过期时间作为 ARGV 发送:

redis.call('set', KEYS[1], ARGV[1],'EX', ARGV[2])
return 1

您也可以仅当 expiration > 0 时调用 set。无论进行了什么操作,您都可以返回任何您想要的答案。

使用 SCRIPT LOAD 加载一次 LUA 脚本,保存其 SHA1 答案,并将其与 EVALSHA 一起使用,以避免每次使用时发送/编译 lua 脚本。

相关内容