利用redis实现分布式锁

先说结论: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命令,用法如我开头所说

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容