△Hollis, 一个对Coding有着独特追求的人△
这是Hollis的第 **440 **篇原创分享
作者 l Hollis
来源 l Hollis(ID:hollischuang)
在分布式锁的实现方案中,通常就是数据库、Redis 以及 Zookeeper 这三种,关于分布式锁的多种实现方式及原理我们这里不展开了。网上有很多相关的文章,我的《八股文》中也有十多篇介绍分布式锁相关的。
本文主要聚焦 Redis 的分布式锁和Zookeeper 的分布式锁之间的区别,以及如何选择。
其实在功能上,Redis 的分布式锁和 ZK 的分布式锁都能实现我们想要的功能,锁的互斥、重入等等。他们主要有以下几个区别:
性能区别
在性能方面,Redis 是基于内存存储的,而 ZK 是基于磁盘存储的,所以,在性能上,Redis 要比 ZK 更好一些。
自动释放
ZK 的锁的实现原理是基于客户端和服务端的连接来保证的,一旦连接断了,锁就会被自动释放。而 Redis 的锁是需要自己主动加锁和解锁的,除非达到了超时时间,否则不会自动释放。
所以,ZK 的分布式锁可以更好的应对客户端崩溃的情况,一旦客户端崩溃,锁就会释放,而 Redis 实现的分布式锁,一旦客户端崩溃了,就没有人去进行释放了,只能等超时。
锁能自动释放有啥好处?除了提升并发度以外,还有个好处就是可以减少死锁发生的概率。因为锁释放了,所以就不会出现死锁了。
一致性&可用性要求(CAP)
我们分别介绍过关于 Redis和 Zookeeper 的 CAP 的实现情况,我们知道ZK 是一个 CP 的系统,也就是他是保证强一致性的,而 Redis 是一个 AP 的系统,它是保证可用性的。(关于ZK和Redis的CAP的情况,详见我的八股文中《Zookeeper是AP的还是CP的》、《Redis是AP的还是CP的》等文章)
ZK 会牺牲可用性来保证数据的一致性,即出现部分节点宕机后,集群中少于一半的节点后,或者集群正在进行 master 选举时,都会拒绝新的写请求,导致无法加锁。
而Redis 会牺牲一致性性来保证可用性,即 Redis 的集群中在做数据同步时,如果出现网络延迟,那么即使多个节点上面的数据不一样,客户端也可以正常的进行写入和读取。
那么,在使用 ZK 的分布式锁的时候,不会存在锁丢失的情况,也就是说不太会出现因为锁丢失而导致并发的情况。但是,可能会出现短暂的无法加锁的情况。
而在使用 Redis 的分布式锁的时候,除非集群都挂了,要不然不太会出现无法加锁的情况。但是可能会出现锁丢失的情况,或者说是重复加锁的情况,我们介绍 RedLock 的时候提到的单点故障的问题。(详见我八股文中关于《什么是RedLock,他解决了什么问题》)
做个总结
Redis 实现的分布式锁、性能更好,可用性更高。ZK 实现的分布式锁可以自动释放,减少死锁出现的概率,并且他的一致性更有保障。
所以,
如果你的分布式锁使用场景,对性能要求更高,可以牺牲一点可用性,那么就选择 Redis的分布式锁。而如果你的场景对性能要求没那么高,但是对可用性要求非常高,那么则可以选择 Zookeeper
But
凡事都有个 but,下面就是一些经验之谈了。
其实,如果你对可用性的要求高的话,用 Redis 也行,因为有个 RedLock,他的机制和 zk 很像,都是通过半数以上提交这种方式来避免因为单点问题而导致锁重复的。
但是,RedLock 其实我也不建议大家用,并且 ZK的分布式锁我其实也不建议大家用。就直接用 Redis 就好了。(详见我的八股文中《Redisson 中为什么要废弃 RedLock,该用啥?》)
为啥呢?因为一般来说,我们在用分布式锁的时候,对性能要求肯定很高的,如果不高的话,你直接用数据库的悲观锁就好了。没必要用分布式锁。
而且,往往我们在用分布式锁的时候,同时会伴随着幂等性判断、以及数据库兜底的唯一性约束的校验。所以,即使出现了极端情况,因为 Redis 的一致性没保证好,导致重复加锁了,我们也能在后续的环节中识别并防止并发。
而 Redis 的不可用的问题其实可以通过哨兵、集群等运维手段来解决的,所以,发生的概率本来就极低。所以说,日常开发的时候,只要我们把幂等判断、唯一性约束做好,对账最好,用 Redis 是最简单,高效的办法。
而且,Redis 作为一个缓存框架,很多应用都会直接依赖,直接用SETNX 或者 Redisson 加锁不要太方便。而 Zookeeper,很多都是中间件在使用他, 真正的业务应用依赖的很少的,多引入一个底层中间件,对系统来说也会提升复杂度,减少整体的稳定性的。
除非你真的完全接受不了不一致性,完全不能接受重复加锁,有很愿意依赖 zookeeper,那当我没说,我认为这种情况少之又少。
本文内容节选自我最近出的Java面试宝典,类似的干货及面试题+答案还有10****00多道题。从工作0年到工作8年左右,看了都一定满满收获。
我们会持续更新内容,争取做到全网最新、最全、最准确的Java后端面试宝典。
之前已经推出有一段时间了,大家评价都很好,基本没有差评。我在抖音上的店铺评分是满分的,可以说品质是嘎嘎有保障的。
大家都知道程序员有多难伺候,这侧面证明了这个内容的价值了!
(长按扫码去下单)
很多人也通过这份宝典上岸了(目前已知最高的拿到年包80的Offer,很多人上岸阿里、美团、快手、华为、滴滴、携程、小红书等中大厂),趁现在还未涨价(原价179,现在有70元优惠券,到手109,后续会不断涨价。。。),有需要的抓紧上车吧。
在线课程,文字形式,永久更新。
八股文面试宝典详细介绍:Java面试宝典介绍
下单后,不满意3天内可以无条件退款!只要你觉得它是任何一个市面上可以看到的面试题库可以比拟的,不管别人卖多少钱,只要你有这种感觉了,都直接来退款!就是这么自信!!
(下单后按照短信提示申请权限并联系客服审批即可)
版权归原作者 Hollis Chuang 所有, 如有侵权,请联系我们删除。