美文网首页
利用redis实现分布式锁

利用redis实现分布式锁

作者: 望穿天堂 | 来源:发表于2019-08-22 14:29 被阅读0次

    先说结论:SET {key} {value} NX EX {seconds}

    set命令参考:http://doc.redisfans.com/string/set.html

    SETNX

    redis支持SETNX命令:http://doc.redisfans.com/string/setnx.html

    但是使用SETNX有一个问题,那就是锁不能永久存在,需要释放

    先看下面的代码

    if (!SETNX)
        return
    // 业务逻辑
    DEL
    

    如果在执行业务逻辑的时候出现异常,那么就不会释放锁,造成锁永远存在

    那么是不是可以把删除锁的操作放到finally里?

    try{
        if (!SETNX)
            return
        // 业务逻辑
    }finally{
        DEL
    }
    

    但是在执行DEL的时候,有可能因为一些特殊的原因不能执行成功,比如网络抖动,那么锁依旧得不到释放

    所以需要在SETNX的时候,就给这个key设置一个大约的过期时间(比如3秒),这样即使最终没有DEL,也可以防止锁永远不释放

    try{
        if (!SETNX)
            return
        EXPIRE 3s
        // 业务逻辑
    }finally{
        DEL
    }
    

    同样的,这样给key设置过期时间,依旧可能因为一些特殊的原因不能执行成功,比如网络抖动,EXPIRE失败,然后DEL,又失败,锁得不到释放

    那么SETNX和EXPIRE是否可以放到一个pipeline或者一个MULTI中呢?好吧,我选择狗带,幸亏redis提供了一个单条命令就可以实现加锁和设置过期时间,那就是set命令,用法如我开头所说

    相关文章

      网友评论

          本文标题:利用redis实现分布式锁

          本文链接:https://www.haomeiwen.com/subject/qchnsctx.html