0

node_redis クライアントを使用して、2 番目のコマンドが最初のコマンドの結果に依存しているときに、2 つのコマンドがアトミックに実行されるようにするにはどうすればよいですか。

これが私が考えていることの例です。

client.multi([
    ["hget", orgId, topicId]
]).exec(function (err, sessions) {
    sessions = JSON.parse(sessions);
    if (sessions === undefined) {
        sessions = [sessionId];
    }
    else {
        sessions.push(sessionId)
    }
    client.hset(orgId, topicId, JSON.stringify(sessions)]);
});

これが2か所で同時に実行された場合、新しい値を書き戻す競合状態が発生しないことを誰かが確認できますか?

4

1 に答える 1

0

正しい答えは、値を「見る」ことです。各クエリが独自の接続を持ち、同時実行エラーの可能性を処理することも重要です。

var atomicReadWriteOperationRecursive = function (hashKey, valueKey, count) {
    var client = redis.createClient();
    client.watch(hashKey, valueKey);
    client.hget(hashKey, valueKey, function (err, response) {
            client.multi()
                .hset(orgId, topicId, newValue);
                .exec(function (err) {
                    client.close();
                    if (err && count < 3) {
                        atomicReadWriteOperationRecursive(hashKey, valueKey, count++);  
                    }
                });
        });
}

ここhttps://github.com/mranney/node_redis/issues/545を参照してください。

于 2014-02-02T08:02:39.300 に答える