美文网首页
Redis分布式锁详解

Redis分布式锁详解

作者: Superwind20 | 来源:发表于2017-09-05 23:14 被阅读107次

    在互联网分布式服务部署中,通常会遇到多个进程操作同一个资源的情况,例如秒杀等,此文章主要介绍使用Redis实现分布式锁。

    Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。通常使用setnx(即set not exiest)来实现锁,以下通过循序渐进的方式引入最终实现。

    方案一

    1. C1通过setnx获取锁,处理业务,C1通过del释放锁

    问题:如果处理业务期间C1崩溃,导致死锁

    方案二

    1. C1通过setnx获取锁,锁里面设置为时间戳,全局业务中有配置超时时间EXPIRE,处理业务,C1由于其他原因崩溃

    2. C2,C3通过setnx获取锁失败

    3. 使用get获取T1,T2,且CURTIME>T1(T2)+EXPIRE,超时(若未超时,则sleep,然后重新进入第2步)

    4. C2,C3分别使用del删除锁

    5. C2,C3分别使用setnx获取锁(若未获取到,则sleep,然后重新进入第2步)

    问题:C2,C3串行执行情况下,C2获取的锁会被C3删除,从而导致竞态

    方案三

    1. C1通过setnx获取锁,锁里面设置为时间戳,全局业务中有配置超时时间EXPIRE,处理业务,C1由于其他原因崩溃

    2. C2,C3通过setnx获取锁失败

    3. 使用get获取T1,T2(为nil也进入判断),且CURTIME>T1(T2)+EXPIRE,超时(若未超时,则sleep,然后重新进入第2步)

    4. C2,C3分别使用getset,获取到T11,T22(为nil也进入判断),此时若T11=T1则C2获取锁(T22=T2则C3获取锁,二者只会有1个成立),执行业务。(若未获取到的,则sleep,然后重新进入第2步)

    相关文章

      网友评论

          本文标题:Redis分布式锁详解

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