Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当Redis中存在密钥时,如何进行HSET?_Redis - Fatal编程技术网

仅当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测试\密钥测试\字段