我们运行一个 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 脚本。