我想运行HSET
命令,但前提是该密钥存在。与HSETNX
相似,但用exists
代替not exists
我已经读过关于也许使用WATCH的信息,但是到目前为止,我还不能真正弄清楚。我希望朝着正确的方向前进。我唯一看到的就是这个,但是考虑到这些甚至都不是有效的redis命令,我看不到它是如何工作的。
此外,在阅读了有关我的WATCH后,因为如果另一个请求到来,我不想中止交易。
我基本上是在尝试HGETALL,并在发出第二个HSET命令后立即说,它已经被读取了一次。
在那之后,我希望所有后续请求都知道它已经被读取。
问题是,当我在一个不存在的键上调用HSET时,而不是仅仅失败时,它在redis数据库中创建了一个我不想要的新条目。我只希望它更新记录是否存在,而不必先检查是否存在
因此,该方法无论如何都无法用于高竞争(对密钥有很多请求)
https://github.com/antirez/redis/issues/441
它说我可以以某种方式使用脚本,但是我不确定
答案 0 :(得分:3)
是的。您可以通过运行EVAL
命令在Redis中执行lua脚本。由于Redis是单线程服务器,因此EVAL
之后的所有命令都将被阻止,直到EVAL
完成为止。
文档说:
从2.6.0版开始,EVAL和EVALSHA用于使用Redis内置的Lua解释器评估脚本。
因此,很容易实现一个简单的HSETX
命令,只需运行以下lua脚本:
eval "if redis.call('exists',KEYS[1]) == 1 then redis.call('hset', KEYS[1], ARGV[1], 0) end" 1 test_key test_field