面试必问的分布式锁,你懂了吗?

本文详细探讨了分布式锁的重要性,以及在实际应用和面试中为何经常被问到。主要讨论了Redis和Zookeeper实现分布式锁的方案,包括Redis的Set命令加锁、Lua脚本解锁、RedLock策略以及Zookeeper的临时顺序节点实现。文章还分析了各种方案的优缺点,并提出了分布式锁的选型建议。
摘要由CSDN通过智能技术生成

微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。

我的最新文章:全网最硬核 Redis 大厂面试题解析(2021年最新版)

前言

分布式锁无论是在实际应用,还是面试中,都是经常会遇到的,因此很有必要掌握这个知识点。

今天跟大家一起探讨下当前主流的几种实现方案及其优缺点。

 

正文

为什么需要锁

原因其实很简单:因为我们想让同一时刻只有一个线程在执行某段代码。

因为如果同时出现多个线程去执行,可能会带来我们不想要的结果,可能是数据错误,也可能是服务宕机等等。

以淘宝双11为例,在0点这一刻,如果有几十万甚至上百万的人同时去查看某个商品的详情,这时候会触发商品的查询,如果我们不做控制,全部走到数据库去,那是有可能直接将数据库打垮的。

这个时候一个比较常用的做法就是进行加锁,只让1个线程去查询,其他线程待等待这个线程的查询结果后,直接拿结果。在这个例子中,锁用于控制访问数据库的流量,最终起到了保护系统的作用。

再举个例子,某平台做活动“秒杀茅台”,假如活动只秒杀1瓶,但是同时有10万人在同一时刻去抢,如果底层不做控制,有10000个人抢到了,额外的9999瓶平台就要自己想办法解决了。此时,我们可以在底层通过加锁或者隐式加锁的方式来解决这个问题。

此外,锁也经常用来解决并发下的数据安全方面的问题,这里就不一一举例了。

 

为什么需要分布式锁

 

分布式锁是锁的一种,通常用来跟 JVM 锁做区别。

 

JVM 锁就是我们常说的 synchronized、Lock。

 

JVM 锁只能作用于单个 JVM,可以简单理解为就是单台服务器(容器),而对于多台服务器之间,JVM 锁则没法解决,这时候就需要引入分布式锁。

 

 

实现分布式锁的方式

 

实现分布式锁的方式其实很多,只要能保证对于抢夺“锁”的系统来说,这个东西是唯一的,那么就能用于实现分布式锁。

 

举个简单的例子,有一个 MySQL 数据库 Order,Order 库里有个 Lock 表只有一条记录,该记录有个状态字段 lock_status,默认为0,表示空闲状态,可以修改为1,表示成功获取锁。

 

我们的订单系统部署在100台服务器上,这100台服务器可以在“同一时刻”对上述的这1条记录执行修改,修改内容都是从0修改为1,但是 MysQL 会保证最终只会有1个线程修改成功。因此,这条记录其实就可以用于做分布式锁。

 

常见实现分布式锁的方式有:数据库、Redis、Zookeeper。

 

这其中又以 Redis 最为常见。

 

 

Redis 实现

  • 108
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
面试中涉及到ZooKeeper分布式锁题,通常涉及以下几个方面: 1. 什么是ZooKeeper分布式锁? ZooKeeper分布式锁是基于ZooKeeper提供的原语实现的一种分布式锁机制。它利用了ZooKeeper的有序临时节点和Watcher机制来实现锁的竞争和释放。 2. ZooKeeper分布式锁的实现原理是什么? ZooKeeper分布式锁的实现原理主要依赖于ZooKeeper的有序临时节点和Watcher机制。当一个线程需要获取锁时,它在ZooKeeper的指定路径上创建一个有序临时节点,并且注册一个Watcher来监听前一个节点是否存在。如果前一个节点不存在,则该线程获取锁成功;否则,该线程需要等待前一个节点被删除后继续竞争锁。 3. ZooKeeper分布式锁存在的题有哪些? ZooKeeper分布式锁虽然实现了基本的锁机制,但仍然存在以下题: - 网络延迟:由于网络延迟等原因,可能导致锁的竞争时间增加,影响系统的性能。 - 节点故障:如果持有锁的节点发生故障,可能导致其他节点无法获取锁或长时间等待。 - 死锁:如果在获取锁的过程中发生故障或异常,可能导致死锁情况的发生。 4. 如何解决ZooKeeper分布式锁题? 为了解决ZooKeeper分布式锁存在的题,可以采取以下策略: - 设置合理的超时时间,避免长时间等待导致系统性能下降。 - 使用心跳机制来检测节点的存活状态,及时处理节点故障。 - 采用分布式协调框架或工具,如Curator、Spring Integration等,简化分布式锁的使用和管理。 这些是一些常见的ZooKeeper分布式锁面试题及其答案,希望能对你有所帮助!
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员囧辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值