Redis--分布式锁

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

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

推荐阅读更多精彩内容

  • 分布式锁的解决方式 基于数据库表做乐观锁,用于分布式锁。(适用于小并发) 使用memcached的add()方法,...
    xiaolyuh阅读 15,602评论 6 17
  • 一看到标题就知道,这一篇博客又是总结分布式工作环境中集群产生的问题,个人觉得分布式没有那么难以理解,可能也是自己见...
    ChaLLengerZeng阅读 9,352评论 3 19
  • 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper...
    程序员技术圈阅读 3,874评论 4 80
  • 毛达要回来了。 从知道这个消息的时候我的嘴就没合拢过。以至于搏击课时教练一直很奇怪的瞟我。 毛达是我闺蜜的儿子,也...
    杨戬阅读 232评论 0 1
  • 昏黄天际、 微风轻柔、 淅淅沥沥的雨丝、 布满山野万物。 矗立风雪中、 寻找儿时的脚印、 寻梦 迷茫、 多想回到童...
    格扎旺索阅读 271评论 0 0