【问题标题】:basic logic of lock - mutual exclusion锁的基本逻辑——互斥
【发布时间】:2015-01-24 07:37:51
【问题描述】:

我正在为互斥锁的逻辑而苦苦挣扎;在这里我检查密钥是否被占用,如果没有,我们会拿到它,完成后释放它;但是你能帮我如何让我有一个循环来检查密钥直到它可用吗?

rdb.setnx(lockkey, 'taken', function (err, lockvalue) {
    if (err) {
        console.error(err);
    } else if (lockvalue == 1) {
        // You have the lock; process it
        //Release the key when you are done:
        rdb.del(lockkey);
    } else if (lockvalue == 0) {
        // Key is taken by someone else; so how can I have a loop to check until key is available to take? 
    }
});

感谢您的帮助 :-)

更新:

非常感谢 Adeneco 的回答;我一直对自执行功能的逻辑感到困惑;所以如果我想通过超时,请确认我的逻辑是正确的:

n=1;
(function rec(n) {
    rdb.setnx(lockkey, 'taken', function (err, lockvalue) {
        if (err) {
            console.error(err);
        } else if (lockvalue == 1) {
            // You have the lock; process it
            //Release the key when you are done:
            rdb.del(lockkey);
        } else if (lockvalue == 0) {
            // Key is taken by someone else; try again
            setTimeout(function(){ rec(n++); }, 30<<n);            
        }
    });
})();

【问题讨论】:

    标签: javascript node.js design-patterns redis mutual-exclusion


    【解决方案1】:

    你可以使用递归函数,然后再次调用它

    (function rec() {
        rdb.setnx(lockkey, 'taken', function (err, lockvalue) {
            if (err) {
                console.error(err);
            } else if (lockvalue == 1) {
                // You have the lock; process it
                //Release the key when you are done:
                rdb.del(lockkey);
            } else if (lockvalue == 0) {
                // Key is taken by someone else; try again
                rec();
            }
        });
    })();
    

    如有必要,可以使用超时来延迟递归调用

    【讨论】:

    • 非常感谢您的回答;我一直对自执行功能的逻辑感到困惑;所以如果我想通过超时,请确认我的逻辑是正确的(我在答案部分添加了我的逻辑)
    • 是的,这似乎是正确的,按位移位很聪明
    • 刚写的,可以在底部传n
    • 您已经在代码中全局定义了它,因此只需删除也可以使用的本地参数,因此您不必这样做,但您可能应该这样做。另外我会做rec(++n) 否则你会被困在1 并且它永远不会增加
    • 要获得更具弹性的解决方案,您可能希望改用此算法:redis.io/topics/distlock
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2012-06-05
    • 2010-09-16
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2012-12-25
    相关资源
    最近更新 更多