在上一篇文章中,我们知道了,当在集群环境下,synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢?我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。
在集群下,不同jvm,就有多个锁监视器。那么,使用分布式锁应该是什么样的?我们可不可以把锁监视器提出来,放到一个三方组件中,集群中所以的JVM进程都可以共享访问到这个公共的锁监视器呢?如下图:
上图就是分布式锁的示意图。那么什么是分布式锁呢?
什么是分布式锁?
分布式锁需要满足分布式系统或者集群模式下多个进程可见并且互斥的锁。
分布式锁应该满足什么样的条件呢?
可见性
注意:这个地方说的可见性并不是我们并发编程中指的内存的可见性。只是说多个进程之间都能够感知到变化的意思。
互斥
高可用
高性能
由于加锁本身就是让性能降低,所以对于分布式锁本身需要有较高的加锁性能和释放锁的性能
安全性
常见的分布式锁有三种
Mysql实现分布式锁
mysql本身就带有锁机制,但是由于mysql性能本身一般,所以采用分布式锁的情况下,起始使用MySQL作为分布式锁比较少见;
Redis实现分布式锁
redis作为分布式锁是非常常见的一种使用方式,现在企业级开发中基本都是使用Redis或者zookeeper作为分布式锁。Redis实现分布式锁,利用的是setnx这个方法,如果插入key成功,则表示或得到了锁,如果有人插入成功,其他人插入失败则标识无法获取到锁,利用这套逻辑来实现分布式锁的。
Zookeeper实现分布式锁
zookeeper也是企业级开发中比较好的一个实现分布式锁的方案。主要使用到了临时有序节点和watch机制来实现的。本系列教程主要讲解Redis的,所以这里就不过多的阐述了。
我们来看看三种实现方式比较
下节预告:基于Redis实现分布式锁实现思路