面试连环炮系列专栏,暂不想换工作的同学可补充知识盲点查缺补漏,准备换工作的同学可针对性突击训练,不打无准备之战。面试战场所向披靡,成为offer收割机,找到心仪的工作。 

楼主努力更新,争取每日多更。有想关注的方向可留言,楼主针对性更新。已更新的内容也会不断更新完善增加更多的"炮弹",祝大家面试时可以吊打面试官。

目录

1、为什么使用分布式锁?

2、分布式锁的设计注意事项

3、分布式锁有哪些实现方式

4、基于Redis的实现方式

5、Redssion锁分类

6、zk实现分布式锁

7、zk使用场景

8、对比

9、zk生产环境部署情况


1、为什么使用分布式锁?

为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。

2、分布式锁的设计注意事项

互斥:在分布式高并发的条件下,我们最需要保证,同一时刻只能有一个线程获得锁,这是最基本的一点。
不能死锁:在分布式高并发的条件下,比如有个线程获得锁的同时,还没有来得及去释放锁,就因为系统故障或者其它原因使它无法执行释放锁的命令,导致其它线程都无法获得锁,造成死锁。

所以分布式非常有必要设置锁的有效时间,确保系统出现故障后,在一定时间内能够主动去释放锁,避免造成死锁的情况。

性能:对于访问量大的共享资源,需要考虑减少锁等待的时间,避免导致大量线程阻塞。

所以在锁的设计时,需要考虑两点。

锁的颗粒度要尽量小。比如你要通过锁来减库存,那这个锁的名称你可以设置成是商品的ID,而不是任取名称。这样这个锁只对当前商品有效,锁的颗粒度小。

锁的范围尽量要小。比如只要锁2行代码就可以解决问题的,那就不要去锁10行代码了。

3、分布式锁有哪些实现方式

一般分布式锁有三种实现方式:基于数据库、基于缓存(redis)、基于Zookeeper。

基于数据库的分布式锁不太常用,所以不做深入讨论。

4、基于Redis的实现方式

1、选用Redis实现分布式锁原因:
(1)Redis有很高的性能;
(2)Redis命令对此支持较好,实现起来比较方便

redis有两种实现方式

1、基于SETNX命令实现

推荐使用NX的方式

SET resource_name my_random_value NX PX 30000NX:表示只有 key 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 nil)
PX 30000:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了

2、使用Redisson

Redisson中加锁/释放锁操作都是用lua脚本完成的,封装的非常完善,开箱即用。极大的简化了分布式锁的实现。

Redisson还实现了多种锁策略,可根据业务场景自行选择。

5、Redssion锁分类

1. 可重入锁(Reentrant Lock)
Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁。
Redisson同时还为分布式锁提供了异步执行方法。
2. 公平锁(Fair Lock)
Redisson分布式可重入公平锁也是实现了java.util.concurrent.locks.Lock接口的一种RLock对象。在提供了自动过期解锁功能的同时,保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。
3. 联锁(MultiLock)
Redisson的RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以来自于不同的Redisson实例。
4. 红锁(RedLock)
Redisson的RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock
对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例。
5. 读写锁(ReadWriteLock)
Redisson的分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写入锁。
6. 信号量(Semaphore)
Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法
7. 可过期性信号量(PermitExpirableSemaphore)
Redisson的可过期性信号量(PermitExpirableSemaphore)实在RSemaphore对象的基础上,为每个信号增加了一个过期时间。每个信号可以通过独立的ID来辨识,释放时只能通过提交这个ID才能释放。
8. 闭锁(CountDownLatch)
Redisson的分布式闭锁(CountDownLatch)Java对象RCountDownLatch采用了与java.util.concurrent.CountDownLatch相似的接口和用法。

6、zk实现分布式锁

curator基于zk实现分布式锁,可实现共享不可重入锁,共享可重入锁,信号量等。

7、zk使用场景

分布式协调
这个其实是 zookeeper 很经典的一个用法,简单来说,就好比,你 A 系统发送个请求到 mq,然后 B 系统消息消费之后处理了。那 A 系统如何知道 B 系统的处理结果?用 zookeeper 就可以实现分布式系统之间的协调工作。A 系统发送请求之后可以在 zookeeper 上对某个节点的值注册个监听器,一旦 B 系统处理完了就修改 zookeeper 那个节点的值,A 系统立马就可以收到通知,完美解决。
分布式锁
举个栗子。对某一个数据连续发出两个修改操作,两台机器同时收到了请求,但是只能一台机器先执行完另外一个机器再执行。那么此时就可以使用 zookeeper 分布式锁,一个机器接收到了请求之后先获取 zookeeper 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作;然后另外一个机器也尝试去创建那个 znode,结果发现自己创建不了,因为被别人创建了,那只能等着,等第一个机器执行完了自己再执行。
元数据/配置信息管理
zookeeper 可以用作很多系统的配置信息的管理,比如 kafka、storm 等等很多分布式系统都会选用 zookeeper 来做一些元数据、配置信息的管理,包括 dubbo 注册中心不也支持 zookeeper 么?
HA高可用性
这个应该是很常见的,比如 hadoop、hdfs、yarn 等很多大数据系统,都选择基于 zookeeper 来开发 HA 高可用机制,就是一个重要进程一般会做主备两个,主进程挂了立马通过 zookeeper 感知到切换到备用进程。

8、对比

实现难度上:Zookeeper >= redis
服务端性能:redis > Zookeeper
客户端性能:Zookeeper > redis
可靠性:Zookeeper > redis

选型的时候,该如何做呢?这要看你的基础设施。如果你的应用用到了zk,而且集群性能很强劲,优选zk。如果你只有redis,不想为了个分布式锁,引入臃肿的zk,那就用redis。

9、zk生产环境部署情况

暂略

不管你多牛,一定要提前准备,千万不要裸面。另外面试准备也尽量不要死记硬背,要结合自己项目的情况有自己的见解。不管是面试中级、高级还是架构岗位都最好准备一些新技术架构的思考,比如云原生、Service Mesh、中台、DevOps等等。

关注公众号小猿架构,发送 yys 免费获取 《云原生技术与架构实践》。

面试连环炮之分布式锁相关推荐

  1. 面试热点Redis分布式锁,再细说一次

    欢迎关注方志朋的博客,回复"666"获面试宝典 谈起redis锁,下面三个,算是出现最多的高频词汇: setnx redLock redisson | setnx 其实目前通常所说 ...

  2. redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性

    分布式锁 多个系统同时操作一个redis,因为jvm锁是线程级别的,所以没有办法锁住多个系统. Redis锁实现: setnx key value 只有在key不存在时设置key的值 此时key相当于 ...

  3. 面试官:Redis分布式锁解决方案是什么?

    今天博主在这片文章中主要给大家讲下Redis分布式锁的原理以及解决方案 学到三连呦 1.Redis分布式锁原理 1.1.简述 我们知道分布式锁的特性是排他.避免死锁.高可用.分布式锁的实现可以通过数据 ...

  4. 阿里面试官:分布式锁到底用Redis好?还是Zookeeper好?

    首先,分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在 ...

  5. 面试官:分布式锁用Redis好?还是Zookeeper好?

    提到锁大家肯定有了解,像 Synchronized.ReentrantLock,在单进程情况下,多个线程访问同一资源,可以用它们来保证线程的安全性. 不过目前互联网项目越来越多的项目采用集群部署,也就 ...

  6. Redlock——Redis集群分布式锁

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...

  7. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。

    来自:why技术 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 low,实际很 ...

  8. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架

    背景铺垫 面试的时候,不管你的简历写没写 Redis,它基本上是一个绕不过的话题. 为了引出本文要讨论的关于 Redlock 的神仙打架的问题,我们就得先通过一个面试连环炮: Redis 做分布式锁的 ...

  9. 面试官问:说说悲观锁、乐观锁、分布式锁?都在什么场景下使用?有什么技巧?...

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 如何确保一个方法,或者一块代码在高并发情况下,同一时间只能 ...

最新文章

  1. POJ3114强连通+spfa
  2. 消息队列--RabbitMQ简单使用
  3. 自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)
  4. android BluetoothAdapter蓝牙BLE扫描总结
  5. 一文重新认识联邦学习
  6. java radix sort_用于Radix Sort的Java程序
  7. 极度烧脑+惊人发现:4个颠覆你世界观的量子理论实验
  8. 002A demo of the Spectral Co-Clustering algorithm
  9. 【POJ1088】滑雪
  10. 计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识
  11. UVA11398 The Base-1 Number System【进制】
  12. U盘无法格式化解决方法
  13. latex安装后运行报错:系统找不到指定的文件,试试这样吧
  14. uniapp,小程序返回到指定页面以及到指定页面左上角的房型默认返回首页
  15. Win10设置系统补丁更新服务器,win10系统手动更新补丁如何设置 win10系统手动安装更新方法...
  16. 爬取全国各地区汽车销量情况并用中国地图可视化展示
  17. 可见性,原子性,有序性的源头(一)
  18. kafka的副本以及分区与副本的关系
  19. 国内开源镜像站点汇总[超级多]
  20. poj1737 Connected Graph

热门文章

  1. OJ题库1015: 计算时间间隔
  2. 【微信小程序系列】小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet)
  3. FlexRay概述 -FlexRay的基本组件及状态机图
  4. 【linux虚拟机使用yum安装MySQL+修改密码】
  5. 皇甫懒懒 华清远见Java学习笔记-身份证校验
  6. 用MySQL创建数据库和数据库表(linux终端操作)
  7. xp远程登录linux,Linux操作系统下如何远程登录XP桌面
  8. Mac和Windows共享文件,不借助任何软件
  9. csdn上传图片无水印
  10. 安装程序包的语言不受系统支持