美文网首页
利用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