美文网首页Redis
Redis--分布式锁

Redis--分布式锁

作者: vsu | 来源:发表于2018-10-23 17:06 被阅读0次

    2018-10-23

    常用的四种方案:
    1 、基于数据库表做乐观锁,用于分布式锁
    增加版本号
    缺点:增加了一次select版本号操作、数据库开销大、可能脏数据

    2 、使用memcached的add方法,用于分布式锁
    add使用时指定有效时间,发生宕机,也会释放资源,避免死锁

    3 、使用redis的setnx、expire方法
    同上

    4 、使用redis的setnx、get、getset方法
    针对上面3可能出现死锁(在expire执行前宕机)
    1. setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。
    2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向3。
    3. 计算newExpireTime=当前时间+过期超时时间,然后getset(lockkey, newExpireTime) 会返回当前lockkey的值currentExpireTime。
    4. 判断currentExpireTime与oldExpireTime 是否相等,如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。
    5. 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行delete释放锁;如果大于锁设置的超时时间,则不需要再锁进行处理。

    不常用的方案:
    1 使用memcached的cas方法
    2 使用redis的watch、multi、exec命令
    3 使用zookeeper

    相关文章

      网友评论

        本文标题:Redis--分布式锁

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