仅当Redis中存在密钥时,如何进行HSET?
我想运行仅当Redis中存在密钥时,如何进行HSET?,redis,Redis,我想运行HSET命令,但前提是该键存在。与HSETNX类似,除了存在而不是不存在 我读过关于可能使用手表或其他东西的书,但到目前为止我还不能真正理解。我希望你能朝着正确的方向轻推我。我唯一看到的是这个,但考虑到这些甚至都不是有效的redis命令,我不知道它是如何工作的 另外,在阅读了有关WATCH的文章后,我也很担心它,因为我不想在收到另一个请求时中止该事务 我基本上是尝试HGETALL,并在发出第二个HSET命令后立即执行该命令,表示该命令已被读取一次 之后,我希望所有后续请求都知道它已经被
HSET
命令,但前提是该键存在。与HSETNX
类似,除了存在
而不是不存在
我读过关于可能使用手表或其他东西的书,但到目前为止我还不能真正理解。我希望你能朝着正确的方向轻推我。我唯一看到的是这个,但考虑到这些甚至都不是有效的redis命令,我不知道它是如何工作的
另外,在阅读了有关WATCH的文章后,我也很担心它,因为我不想在收到另一个请求时中止该事务
我基本上是尝试HGETALL,并在发出第二个HSET命令后立即执行该命令,表示该命令已被读取一次
之后,我希望所有后续请求都知道它已经被读取
问题是,当我在一个不存在的键上调用HSET时,它会在redis数据库中创建一个新条目,而不是失败,这是我不想要的。我只希望它更新记录,如果它存在,而不必先检查它是否存在
根据这一点,对于高争用性,该方法无论如何都不起作用(将有大量对密钥的请求)
它说我可以以某种方式使用脚本,但我不确定是否可以。您可以通过运行
EVAL
命令在Redis中执行lua脚本。由于Redis是一个单线程服务器,因此在EVAL
完成之前,将阻止EVAL
之后的所有命令
文件说:
EVAL和EVALSHA用于从版本2.6.0开始使用Redis中内置的Lua解释器评估脚本
因此,很容易实现一个简单的HSETX
命令,只需运行下面的lua脚本:
eval“如果redis.call('exists',key[1])==1,则redis.call('hset',key[1],ARGV[1],0)结束”1测试密钥测试字段
伙计太棒了,谢谢你。你能告诉我我是怎么在那里连第二个命令的吗?我真想马上给HGETALL和HSET打电话。。因此`如果存在;hgetall;设置其他的如果redis.call('exists',KEYS[1])==1,则不执行任何操作“@Tallboy eval”,然后本地ret=redis.call('hgetall',KEYS[1]);redis.call('hset',KEYS[1],ARGV[1],1)返回ret end“1测试\密钥测试\字段