用查询更新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(整数)1127.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)“外部”