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
用查询更新Redis_Redis_Updates_Atomicity - Fatal编程技术网

用查询更新Redis

用查询更新Redis,redis,updates,atomicity,Redis,Updates,Atomicity,我是新来的redis,但通过阅读文档,我找不到是否可以通过查询更新值(如mongo或postgres) 例如,我想为大厅中的玩家执行一些逻辑。我只想将用户状态更新为大厅,前提是它位于主页 在应用程序中应用此逻辑将不起作用,因为我可能会遇到两个进程之间的竞争条件。 我会在mongo做这样的事情: update({id:1, status:home}, {status: lobby}) 这样,如果更新成功并且是原子的,我将收到结果(成功或失败) 如何在redis中执行此操作?与其他文档存储/RDB

我是新来的
redis
,但通过阅读文档,我找不到是否可以通过查询更新值(如
mongo
postgres

例如,我想为大厅中的玩家执行一些逻辑。我只想将用户状态更新为
大厅
,前提是它位于
主页

在应用程序中应用此逻辑将不起作用,因为我可能会遇到两个进程之间的竞争条件。
我会在mongo做这样的事情:

update({id:1, status:home}, {status: lobby})
这样,如果更新成功并且是原子的,我将收到结果(成功或失败)


如何在redis中执行此操作?

与其他文档存储/RDBMS一样,redis中没有查询更新功能

您可以使用或执行原子更新,并将一批命令组合在一起


Redis使用单个线程进行命令处理(目前为止),因此评估脚本将以原子方式执行,可能比multi-exec更直接。

您可以在LUA过程中执行:

eval "local ks=redis.call('keys','user:*') for k=1,#ks do print(k) if (redis.call('hget',ks[k],'status') == KEYS[1]) then redis.call('hset',ks[k],'status',KEYS[2]) end end" 2 home lobby
127.0.0.1:6370>hset用户:1 id 1(整数)1
127.0.0.1:6370>hset用户:1状态外部(整数)1
127.0.0.1:6370>hset用户:2 id 2(整数)1
127.0.0.1:6370>hset用户:2状态主(整数)1
127.0.0.1:6370>评估“本地ks=redis.call('key','user:'),对于k=1,#如果(redis.call('hget',ks[k],'status')==key[1]),则ks打印(k) redis.call('hset',ks[k],'status',key[2])end“2主大厅
(无)
127.0.0.1:6370>hgetall用户:2 1)“id”2)“2”3)“状态”4)“大厅”
127.0.0.1:6370>hgetall用户:1 1)“id”2)“1”3)“状态”4)“外部”