一篇文章30分钟带您了解分布式锁

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


一篇文章30分钟带您了解分布式锁

01你以为分布式锁是什么?

分布式锁听起来挺高大上的,那么我这么说呢!
分布式 + 锁

01::01 分布式

这里我引用一下百度百科的说法:

当计算机的程序和数据通过网络分布在多于一个的计算机上时,计算就成为“分布式的”。


01::02 锁(大白话)

 顾名思义锁就是锁,你可以理解成你出门要把门锁住,防止其他人进去


01::03 分布式锁(大白话)

 那么我们组合一下,因为计算机的程序和数据通过网络分布在多于一个的计算机上,那么如果我没有一把锁,当大波的访问数据来临的时,我们通过负载均衡的方式将这些访问分发出去,分发到每个节点部署的程序上进行逻辑操作,重点来了,这时,如果我们没有一把锁的话,如果只是查询的业务,那没有问题,如果只是单一修改的业务也没有问题,但如果是关联性的修改,这时候你没有一把锁,来保护逻辑的执行顺序,你觉得可以吗?

 这就是分布式锁存在的原因。


02 分布式锁(概念)

02::01 锁机制

 在单体应用时代,传统企业级java应用为了解决"高并发下多线程访问共享资源时出现数据不一致"的问题,通常是借助JDK自身提供的关键字或者并发工具 synchronize、lock和RetreenLock等加以实现。

 在深入一点,锁机制的出现就是为了保护你所写的代码在多线程的模式下是属于线程安全的。
 下面是讲解关于线程安全的文章,学术语言比较多,对于初学者理解的话可能会有点深,但没关系,可以先记下来,日后慢慢的就理解了。
链接>>>>>>>线程安全?


02::02 分布式锁出现的原因?

 在分布式系统时代,因为许多服务实例和系统是分开部署的,它们都拥有自己的主机,独立的JDK,导致应用系统在分布式部署的请下,这种控制"并发线程访问共享资源"的机制不起作用,因为此时的"并发访问共享资源"演变成为"跨JVM进程之间的访问共享资源"了。

 简单来说Lock和synchronized等锁机制只能在一个jvm中起效,如果集群部署,那么在多个JVM中就会造成无锁模式。

 因此分布式锁就这么诞生了。


02::03 分布式锁是一种组件、中间件还是一种实现方式?

  分布式锁,也是一种锁机制,只不过是为了专门应对分布式环境而出现的,
它并不是一种全新的组件或者中间件,它只是一种机制,一种实现方式,即解决方案而已。
  它是用来保证在分布式的环境下,通过锁机制让多个客户端或者多个服务进程互斥地对"共享资源"进行访问,从而避免出现并发安全、数据不一致等问题。


02::04 分布式锁要如何理解?

  即通过第三方带有原子性的行为来保护高并发下的安全问题。
  可能这句话对初学者有点绕口,没关系,记下来,会有帮助的。


03 分布式锁的设计与使用

03::01 分布式锁的设计的几点要求

业界普遍有几点要求:

  1. 排他性
  2. 避免死锁
  3. 高可用
  4. 可重入
  5. 公平锁(可选)

03::01::01 什么是排他性?

即保证在分布式环境下,共享的资源、代码块、数据在同一实际只能被一台机器上的一个线程执行。


03::01::02 什么是避免死锁?
  • 正常流程: 当这把锁获取后,经过一段有限的时间,一定要释放;
  • 异常流程: 异常情况下释放;

03::01::03 什么是高可用?

获取或释放锁的机制必须高可用而且性能极佳。


03::01::04 什么是可重入?

这把锁最好是一把可重入锁,即当前机器的线程如果没有获取到,那么等待一段时间后要保证可以被获取到。


03::01::05 什么是公平锁?

即当保证来自不同机器的并发线程可以公平的获取到锁。


03::02 分布式锁的设计的几种方案

  1. 基于数据库级别的乐观锁、悲观锁;
  2. 基于Redis的原子操作;
  3. 基于zk的互斥排他锁;
    主要是通过创建临时的有序节点+ watcher机制
  4. 基于开源框架Redisson的分布式锁;

04 分布式锁应用场景举例

  1. 重复提交;
    前端用户注册场景(重点在于注册入库之前要先查用户信息)
  2. 商场并发抢单
    抢购活动场景(重点在于抢购之前要先查库存)

猜你喜欢

转载自blog.csdn.net/weixin_38316697/article/details/117363258