我是redis
的新手,但是从阅读文档中我无法找到是否可以使用查询更新值(例如mongo
或postgres
)。
例如,我想为大厅中的玩家执行一些逻辑。我想将用户状态更新为lobby
,前提是home
在应用程序中应用此逻辑将不起作用,因为我可能在两个进程之间遇到竞争条件
我会在mongo中做这样的事情:
update({id:1, status:home}, {status: lobby})
这样,如果更新成功,我将收到结果(成功或失败),并且它是原子的。
我如何在redis
中完成?
答案 0 :(得分:1)
Redis中没有按查询更新,就像在其他文档存储/ RDBMS中一样
您可以使用MULTI-EXEC transactions或EVAL / EVAL SHA执行原子更新并一起编写一批命令
Redis使用单个线程进行命令处理(截至目前),因此评估脚本将以原子方式执行,并且可能比多执行程序更直接。
答案 1 :(得分:0)
您可以在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 user:1 id 1(整数)1
127.0.0.1:6370> hset user:1状态外(整数)1
127.0.0.1:6370> hset user:2 id 2(整数)1
127.0.0.1:6370> hset user:2 status home(整数)1
127.0.0.1:6370> eval“local ks = redis.call('keys','user:*')表示k = 1,#ks执行print(k)if(redis.call('hget',ks [k],'status') == KEYS [1])然后 redis.call('hset',ks [k],'status',KEYS [2])end end“2 home lobby
(无)
127.0.0.1:6370> hgetall用户:2 1)“id”2)“2”3)“status”4)“lobby”
127.0.0.1:6370> hgetall用户:1 1)“id”2)“1”3)“status”4)“outside”