1 / 5
文档名称:

分布式环境下的解决方案-分布式锁.docx

格式:docx   大小:114KB   页数:5页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

分布式环境下的解决方案-分布式锁.docx

上传人:科技星球 2022/3/10 文件大小:114 KB

下载得到文件列表

分布式环境下的解决方案-分布式锁.docx

相关文档

文档介绍

文档介绍:分布式环境下的解决方案
分布式锁
 
   
 
 
 
 
 
 
 
     
 
 
 
 
 
分布式锁,也就是在多进程情况下的锁。
多进程的锁 跟 多线程的 锁 有什么相同的地方呢?
   
 
   
分布式环境下的解决方案
分布式锁
 
   
 
 
 
 
 
 
 
     
 
 
 
 
 
分布式锁,也就是在多进程情况下的锁。
多进程的锁 跟 多线程的 锁 有什么相同的地方呢?
需要有存储锁的空间,并且锁的空间是可以访问到的。
锁需要被唯一标识。
锁要有至少两种状态。
储存空间:
锁是一个抽象的概念,锁的实现,需要依存于一个可以存储锁的空间。在多线程中是内存,在多进程中是内存或者磁盘。更重要的是,这个空间是可以被访问到的。多线程中,不同的线程都可以访问到堆中的成员变量;在多进程中,不同的进程可以访问到共享内存中的数据或者存储在磁盘中的文件。但是在分布式环境中,不同的主机很难访问对方的内存或磁盘。这就需要一个都能访问到的外部空间来作为存储空间。
最普遍的外部存储空间就是数据库了,事实上也确实有基于数据库做分布式锁(行锁、version乐观锁),如quartz集群架构中就有所使用。除此以外,还有各式缓存如Redis、Tair、Memcached、Mongodb,当然还有专门的分布式协调服务Zookeeper,甚至是另一台主机。只要可以存储数据、锁在其中可以被多主机访问到,那就可以作为分布式锁的存储空间。
唯一标识:
不同的共享资源,必然需要用不同的锁进行保护,因此相应的锁必须有唯一的标识。在多线程环境中,锁可以是一个对象,那么对这个对象的引用便是这个唯一标识。多进程环境中,信号量在共享内存中也是由引用来作为唯一的标识。但是如果不在内存中,失去了对锁的引用,如何唯一标识它呢?上文提到的有名信号量,便是用硬盘中的文件名作为唯一标识。因此,在分布式环境中,只要给这个锁设定一个名称,并且保证这个名称是全局唯一的,那么就可以作为唯一标识。
至少两种状态:
为了给临界区加锁和解锁,需要存储两种不同的状态。如ReentrantLock中的status,0表示没有线程竞争,大于0表示有线程竞争;信号量大于0表示可以进入临界区,小于等于0则表示需要被阻塞。因此只要在分布式环境中,锁的状态有两种或以上:如有锁、没锁;存在、不存在等等,均可以实现。
数据库:去判断某个字段的状态 来判断是否能得到锁。
redis:根据 setnx 命令 来判断, 如果返回1 则获取到了锁,否则就是没获取到,死锁,锁的有效期的问题点:
zookeeper : 1、通过注册临时节点的方式,能注册成功会返回节点的名称,就是获取到了锁,
                           2、去创建最小临时有序节点,通过一系列的判断,当注册的节点是最小节点时就获取到了锁。临时节点消失也就意味着锁释放。
通过了解分布式锁 跟 普通 的锁的相同点之后,其实自己就可以实现一个简单的分布式锁,但为什么要用redis或者是 zookeeper这样复杂的中间件呢?
因为redis 跟zookeeper 会给我们解决下面这些问题:
问题1:锁状态判断原子性无法保