Redis使用查询进行更新

时间:2018-06-03 08:45:35

标签: redis updates atomicity

我是redis的新手,但是从阅读文档中我无法找到是否可以使用查询更新值(例如mongopostgres)。

例如,我想为大厅中的玩家执行一些逻辑。我想将用户状态更新为lobby,前提是home 在应用程序中应用此逻辑将不起作用,因为我可能在两个进程之间遇到竞争条件 我会在mongo中做这样的事情:

update({id:1, status:home}, {status: lobby})

这样,如果更新成功,我将收到结果(成功或失败),并且它是原子的。

我如何在redis中完成?

2 个答案:

答案 0 :(得分:1)

Redis中没有按查询更新,就像在其他文档存储/ RDBMS中一样

您可以使用MULTI-EXEC transactionsEVAL / 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”