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

本文详细探讨了分布式锁的重要性,以及在实际应用和面试中为何经常被问到。主要讨论了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 实现

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员囧辉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值