前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解分布式锁

深入理解分布式锁

作者头像
袁新栋-jeff.yuan
发布2020-08-26 17:52:10
4430
发布2020-08-26 17:52:10
举报

深入理解分布式锁

什么是分布式锁?

分布式锁是实现有序调度不同的进程,解决分布式系统下不同进程之间相互干扰的问题的技术手段

分布式锁的实现方式

  1. redis:利用redis的setnx命令,此命令同样是原子性的操作,只有在key不存在的情况下,add成功
  2. mechache:利用mechache的add命令,改命令是原子性的操作,只有在key 不存在的情况下,才能add成功,也就意味着线程拿到了锁
  3. zookeeper:zookeeper利用他的顺序临时节点,来实现分布式锁和等待队列,zookeeper的设计初衷就是为了实现分布式微服务的
使用redis实现分布式锁的思路

当你需要去订购一个商品的时候,为了防止商品计算剩余数量出错的时候

  1. 我们将商品的ID(代表这个商品的唯一标识)作为key使用setNt(ID,"")会返回一个结果(Long result = jedis.setnx(key, value);返回值result:设置成功,返回 1 。设置失败,返回 0 )
  2. 加上了锁之后,按正常业务走,当执行完这方法的最后将锁删除,也就是将setNX的key Delete掉。
  3. 当系统异常的时候那岂不是就会产生死锁,所以为防止产生死锁,我们将这个锁设置一个合适的超时失效时间,使用 expire。
思考以上设计的问题:
  1. 原子性问题: 先给加上了setNx 但是由于某种原因导致锁没有加上过期时间那么就会在某次执行的的时候系统异常而没有删除锁而导致死锁。 解决办法:redis提供了原子性的操作 set ( key , value , expire)
  2. 误删除锁: 当我们给某次任务加上锁并且设置过期时间为20秒,但是他在这20秒内没有执行完且没有异常,于是这个锁过期了,然后第二个任务进来,刚设置了锁也加了过期时间,这个时候第一个任务也执行结束了。于是将第二次的锁删掉了,于是导致误删锁。 解决办法:redis提供了原子性的操作 set ( key ,threadId, expire) 将value存为线程ID 当去删除的时候get线程ID 和当前线程ID 做对比,来决定是否删除,解决了误删除还是有一个问题就是这个任务还没执行完另一个任务已经执行,也有可能导致多预定,增加一个守护线程,当锁快要过期的时候进行延长锁时间(具体实现还不太清楚,还得再学学)

zooKepper实现分布式锁

(后面补充) Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深入理解分布式锁
    • 什么是分布式锁?
      • 分布式锁的实现方式
        • zooKepper实现分布式锁
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档