Redis实战14-分布式锁基本原理和不同实现方式对比
在上一篇文章(Redis实战13-集群下线程并发安全问题)中,我们知道了,当在集群环境下,synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢?我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。
我们先来回顾,JVM级别锁的时序图。如下图:
在集群下,不同jvm,就有多个锁监视器。那么,使用分布式锁应该是什么样的?我们可不可以把锁监视器提出来,放到一个三方组件中,集群中所以的JVM进程都可以共享访问到这个公共的锁监视器呢?如下图:
上图就是分布式锁的示意图。那么什么是分布式锁呢?
先来个小福利:【凯哥优惠淘】
凯哥自己开发的,领取外卖、打车、咖啡、买菜、各大电商的优惠券的公¥众¥号。如下图:
什么是分布式锁?
分布式锁需要满足分布式系统或者集群模式下多个进程可见并且互斥的锁。
分布式锁应该满足什么样的条件呢?
可见性
多个线程都能看到相同的结果,
注意:这个地方说的可见性并不是我们并发编程中指的内存的可见性。只是说多个进程之间都能够感知到变化的意思。
互斥
互斥是分布式锁的最基本的条件,是的程序串行执行
高可用
程序不容易崩溃,时时刻刻都保证较高的可用性
高性能
由于加锁本身就是让性能降低,所以对于分布式锁本身需要有较高的加锁性能和释放锁的性能
安全性
安全也是我们程序中必不可少的一个要素
常见的分布式锁有三种
Mysql实现分布式锁
mysql本身就带有锁机制,但是由于mysql性能本身一般,所以采用分布式锁的情况下,起始使用MySQL作为分布式锁比较少见;
Redis实现分布式锁
redis作为分布式锁是非常常见的一种使用方式,现在企业级开发中基本都是使用Redis或者zookeeper作为分布式锁。Redis实现分布式锁,利用的是setnx这个方法,如果插入key成功,则表示或得到了锁,如果有人插入成功,其他人插入失败则标识无法获取到锁,利用这套逻辑来实现分布式锁的。
Zookeeper实现分布式锁
zookeeper也是企业级开发中比较好的一个实现分布式锁的方案。主要使用到了临时有序节点和watch机制来实现的。本系列教程主要讲解Redis的,所以这里就不过多的阐述了。
我们来看看三种实现方式比较
我们从不同维度,对三种实现方式做了对比。如下图:
下节预告:基于Redis实现分布式锁实现思路.
凯哥推荐Redis实现分布式锁系列文章:
《Redis实战11-实现优惠券秒杀下单》
《Redis实战12-优惠券实现一人一单功能》
《Redis实战13-集群下线程并发安全问题》
《Redis实战14-分布式锁基本原理和不同实现方式对比》
或者到凯哥个人博客(聪明的你,从结束语中应该能知道地址)查看Redis系列教程
结束语
大家好,我是凯哥Java(kaigejava),乐于分享技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~