Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
Node.js Redis事务:单连接并发监视_Node.js_Transactions_Redis_Socket.io 1.0 - Fatal编程技术网

Node.js 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吗 换句话说,在

玩nodejs、socket.io和redis事务。
想知道这个代码会发生什么(伪代码)

客户端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');
    ...
});