Node.js Redis事务:单连接并发监视
玩nodejs、socket.io和redis事务。Node.js Redis事务:单连接并发监视,node.js,transactions,redis,socket.io-1.0,Node.js,Transactions,Redis,Socket.io 1.0,玩nodejs、socket.io和redis事务。 想知道这个代码会发生什么(伪代码) 客户端1发送事件“setSomeKey”: ->redis watch someKey ->redis获取someKey并等待回复 客户端2发送事件“setSomeStuff” ->redis观看一些东西 ->redis设置了一些东西并等待回复 客户1: ->接收“someKey”并尝试multi..exec: =>client2设置的“someStuff”上的手表会影响multi-exec吗 换句话说,在
想知道这个代码会发生什么(伪代码) 客户端1发送事件“setSomeKey”:
->redis watch someKey
->redis获取someKey并等待回复 客户端2发送事件“setSomeStuff”
->redis观看一些东西
->redis设置了一些东西并等待回复 客户1: ->接收“someKey”并尝试multi..exec:
=>client2设置的“someStuff”上的手表会影响multi-exec吗 换句话说,在使用监视器观看redis时是否会发生这种情况:
-观看一些关键节目
-获取一些密钥
-看一些东西
-设置一些内容
-多重
-exec=>失败,因为“watch something”在get和multi之间有变化。在回调中执行exec?您得到了答案吗?我敢肯定这会把事情搞砸。目前有相同的“问题”,我没有,但这里有两个替代乐观锁的方法:-通过SET实现悲观锁。。如本文所述的NX,或者使用lua脚本(脚本中的所有操作都是原子的),我可以自信地说,不需要悲观锁定。您仍然可以使用乐观锁定,但需要确保使用WATCH的每段并发运行代码都使用自己的连接。这不会在下游造成任何问题,因为Redis服务器本身是单线程的。然而,它允许绕过问题中描述的内容。
var redis = require('redis');
var client = redis.createClient();
...
socket.on('setSomeKey', function() {
client.watch('someKey');
client.get('someKey',function(err,replies) {
client.multi().set('someKey','someValue').exec();
});
});
socket.on('setSomeStuff', function() {
client.watch('someStuff');
client.set('someStuff','blip');
...
});