关于分布式系统中应该考虑的几个问题包括诸如最基本的分布式锁分布式事务等。该篇中我们将简单来聊聊分布式锁相关知识,比如常见的分布式锁的实现方式有哪些?redis如何设计分布式锁?zk如何设计分布式锁?以及这两种方式哪种效率更高?

1.redis分布式锁

最常见的一种方式也被称为“原生方式”,即不采用任何redis相关的第三方框架的方式。

采用setnx指令的设置一个key,比如setnx mylock,这个setnx的意思就是只有key不存在时才会设置成功,相当于谁先创建成功谁就获得这把锁,然后当前线程执行完毕后就执行del mylock指令删除该key即释放锁,此时其它线程就可以获取锁了。这是redis中最常见的一种做法。

不过显然仅仅这样还是不行的,比如如果在释放锁之前发生了异常或者当前服务宕机,将会导致锁无法释放,这样其它线程就永远不可能获取这把锁了,这就是我们常说的死锁

所以一般的做法就是我们在设置key的时候加上一个过期时间setnx mylock 30 比如设置该key的过期时间为expire 30 30s这样在30s后就会自动删除该key释放锁

但是这样其实还不够,试想如果当前线程在30s过期时间内业务还没执行完,但是锁已经释放,而此时其它线程已经抢占到了锁如果当前线程刚好执行完然后去删除key的话就会有大问题,因为此时的key也就是“锁”已经不属于你了,你会把原本属于其它线程的锁给释放掉,很明显接下来就全乱套了,你为什么要删别人锁啊啊。。。

因此,我们在设置key加锁的时候一般要带上一个标识,这个标识可以放到value中,用来标识当前锁所属的线程,释放锁删除key的时候根据value判断下当前锁是否属于你。

综上所述,有没有发现redis实现分布式锁真的是又“简单”又“复杂”,简单到一条指令就可以搞定,复杂的是你需要考虑各种可能出现的异常情况。

因此一般情况下都是采用框架来做,比如redisson

redis锁的原生方式大致如下图:

2.zk实现分布式锁

zk实现分布式锁的原理很简单实现也很方便,zk采用的是创建临时节点node的方式实现的,即谁创建某个指定的临时节点node成功,谁就获取到了这把锁;其它线程来创建节点就会失败也就无法获取锁,然后通过注册watch监听事件来监听这个节点。释放锁就是删除该节点node,一旦该节点删除就会通知其它注册过监听事件的线程(服务宕机也会自动删除该临时节点,所以不用担心死锁问题),其它线程就会来重新创建节点抢占锁,这就是原生zk实现分布式锁的基本原理。

当然,一般实际情况中都会采用成熟框架的方式创建分布式锁,比如curator,其原理是与原生框架略有区别,是通过创建临时顺序节点的方式实现的,即所有线程都可以创建一个节点,根据创建顺序依次排序其中第一号最小节点client1获取锁,其它线程创建的节点依次对上一个节点注册监听事件,比如client2对client1注册监听事件,client3对client2注册监听事件,当上一个节点删除时,下一个节点会成为最小的“一号”节点,获取锁成功。比如client1删除了节点,那么client2接收到通知,此时client2称为了最小节点因此client2就获取到了锁,依次类推。

zk分布式锁大致原理如下图:

其实要做选择的话,看公司的场景,如果公司是以redis为主的可以选用redis做分布式锁,如果公司使用了zookeeper框架,个人觉得可以考虑zookeeper做分布式锁!

关注微信公众号“虾米聊吧”,获取更多技术知识干货哟~

   扫码关注微信公众号

分布式锁是啥?zk还是redis?相关推荐

  1. 微服务架构之:Redis的分布式锁---搭建生产可用的Redis分布式锁

    Redis分布式锁 集群架构下的并发问题 分布式锁的实现原理和不同方式的实现对比 基于Redis实现的分布式锁 Redis分布式锁1.0版 基于Redis分布式锁1.0版的误删问题 解决误删问题,Re ...

  2. Redis分布式锁原理(一)——redis分布式锁需要注意的问题

    下一篇:Redis分布式锁原理(二)--Redisson分布式锁源码浅析 虽然目前Redisson框架已经帮我们封装好了分布式锁的实现逻辑,我们可以直接像调用本地锁一样使用即可,但本文并不直接剖析Re ...

  3. 分布式锁与实现(一)——基于Redis实现

    概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consisten ...

  4. java分布式锁工具类_java 通过redis实现分布式锁

    1. 开局 在多线程环境中,经常会碰到需要加锁的情况,由于现在的系统基本都是集群分布式部署,JVM的lock已经不能满足分布式要求,分布式锁就这样产生了... 百度一下,网上有很多分布式锁的方案或者例 ...

  5. redis分布式锁java代码_基于redis实现分布式锁

    " 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...

  6. Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务.分布式锁等.那具体什么是分布式锁,分布式锁应用在哪些业务场景.如何来实现分布式锁呢?今天来探讨分布式锁这个话题. ...

  7. Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析Redis分布式锁的正确使用姿势!...

    Redis分布式锁基本原理 采用 redis 实现分布式锁,主要是利用其单线程命令执行的特性,一般是 setnx, 只会有一个线程会执行成功,也就是只有一个线程能成功获取锁:看着很完美. 然而-- 看 ...

  8. redis分布式锁的8大坑【Redis分布式锁】

    在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中. 但不是说用了redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些 ...

  9. 分布式锁和数据一致性的讨论——redis集群做分布式锁的风险

    文章目录 写在前面 分布式锁的三个属性 分布式锁就⼀定要实现这三个属性吗? 实现容错性 方法一:基于多个 Redis 节点实现分布式锁 问题一:进程可能会被挂起,直到锁的 TTL 过期 问题二:墙上时 ...

  10. zk可实现分布式锁,Redis也可实现,之间有什么区别?

    提示: 1.CAP模型 2.数据同步及时性 答案: 使用 zk 实现的分布式锁是 CP 的分布式锁.因为 zk 是 CP 的.在某客户端向 zk 集群中的某节点写入数据后,会等待超过半数的其它节点完成 ...

最新文章

  1. The key of C# 学习笔记I-II
  2. Java高危漏洞被再度利用 可攻击最新版本服务器
  3. matplotlib画图、如何提高图像分辨率?
  4. 编写程序创建一个通讯录文件,在其中存入10位同学的姓名、年龄、电话号码,并在屏幕上输出第2、4、6、8、10位同学的信息
  5. 【c语言】整型数据的溢出
  6. 【译】A gentle introduction to self-sovereign identity
  7. spring-boot使用spring-security进行身份认证(1)
  8. 【心得】Ctrl+Z、\n、\0、eof的区别和用法
  9. P5675-[GZOI2017]取石子游戏【博弈论,dp】
  10. 域服务器批量修改用户密码,Windows域控制器批量创建用户
  11. signature=01a8bb5f15835faa2985256d36b2fe94,Point of Maintenance
  12. 【MFC开发(5)】单选按钮控件RADIOBUTTON
  13. 高斯课堂数电讲义笔记_高斯课堂
  14. C#打造一个开源webgis(四)地图客户端(上)
  15. webim【LayIM】开发者文档
  16. java从键盘输入任意一组数据存入数组中统计非负数个数及非负数个数
  17. 路由器wan口认证断开服务器无响应,路由器WAN口设置已断开(服务器无响应)的解决方法...
  18. 最新!腾讯优图联合厦门大学发布:2021十大人工智能趋势!无监督/多模态等热点...
  19. 精美UI静态界面欣赏
  20. 开放原子训练营(第一季)铜锁探密:基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

热门文章

  1. eltree ref什么时候有_DBA:为什么你老写慢SQL
  2. 实用代码---取得当前的年月日,当前的时分秒获得,周几和星期几获得
  3. java8 list切片_java中怎么从一个数组中截取一定长度的元素放到新数组中
  4. fabric零碎知识
  5. Matplotlib基础全攻略
  6. 百度地图infoWindow圆角处理
  7. 去除 position:fixed 抖动的方法
  8. WMAP环境上传图片报错【找不到临时文件夹】解决方案
  9. jQuery 3.0 的 setter/getter 模式
  10. linux 分区 格式化 挂载 新硬盘