我使用redis来缓存我的Web博客。我的文章中有一个“已选中”字段,如果该字段在数据库中更改,我还需要将新值设置为redis,这是代码
if redis_conn.exists("article"):
redis_conn.hset("article", "checked",1)
看起来还可以,但是如果文章密钥在存在之后且在hset之前过期,则将出现一些问题。文章密钥仅具有一个已选中字段,其他字段(如标题,内容等)将消失。
仅当密钥存在时如何设置密钥,如果密钥过期则什么都不做。
答案 0 :(得分:1)
您可以为此使用Lua脚本,即(伪NodeJS):
redis_conn.eval("if redis.call('EXISTS', KEYS[1])==1 then redis.call('HSET', KEYS[1], ARGV[1], ARGV[2]) end", 1, "article", "checked", 1)
服务器端Lua脚本是原子脚本,因此可以确保该密钥在两次调用之间不会过期。
注意:Redis确实具有HSETNX
命令,但没有HSETEX
命令,这显然是您想要的。