聊聊后端面试那些事

原文

分布式锁问题-【公粽号:堆栈future】

我看在技术大群里面有人问分布式锁问题,说是被面试官各种刁难,我是实在看不下去了,面试官意思很明确,你们有造火箭的经验吗,有的话来他们公司造自行车,没有的话:今天面试就到这里了!

但是说实话面试官没必要因为这个问题继续追问,没啥意思,但是又不得不问,确实有些企业用到分布式锁了。

没办法,逼迫你必须得背会它。

接下来就说下群友面试碰到的问题,因为候选人可能自己已经掌握了实现分布式锁的原理,但是被面试官问到细节可能就不清楚了,因此给大家讲下这块。

1. setnx+expire+del

问题-1 如果setnx执行成功,但是在expire执行的时候redis节点宕机了,在这种情况下,锁不会被释放,导致死锁。解决方案:

  • 可以用SET EX PX NX替换setnx+expire

  • 也可以用lua脚本保持原子操作。

问题-2 如果expire时间过短,但是任务执行时间过长,那么锁会因为过期而被删除,其它客户端可以重新获取锁。在这种情况下,多个客户端同时获取到了锁。解决方案:

  • 过期时间足够长,保证任务可以完成。

  • 启动一个守护线程,为即将到期但尚未释放的锁添加时间。

  • redission

问题-3 如果expire刚好过期,此时删除了这个key,那么当另一个客户端进行获取锁的时候就会抢到锁,那么这个时候当前释放锁的客户端会执行最后的del命令把别的客户端刚才设置的删除了,这个时候就破坏了资源的并发操作。

解决方案:

  • 在这种情况下,我们需要检查正在被删除的锁是否与我们之前获得的锁相同。我们可以在设置它时使用唯一的值,例如直接使用UUID。这样,在删除锁时,我们需要获取锁的对应值,然后与当前节点对象的值进行比较,才能删除锁。
1. uuid = gen()
2. set key uuid ex 5 nx
3. 处理业务逻辑
4. valUUID = get key
5. if valUUID == uuid {delete key} else return

问题-4 假如redis主节点宕机,主从同步延迟或者有问题,那么从成为主之后,客户端就会重新获取到锁,这样也会并发不安全。解决方案:

  • redlock

问题-5 如果redis发生脑裂,那么也会发生多个客户端并发持有多个锁的问题,所以redis为了解决这个脑裂问题,引入两个配置,只有合理配置这两个参数就可以尽最大努力避免脑裂,细节大家下去自行研究哈。

  • min-slaves-to-write

  • min-slaves-max-lag

2. redission

锁过期,但是任务还没执行完成,只需将锁过期时间设置长一点即可。比如拿到锁的线程,开启一个定时的守护线程,每隔一段时间检查一下锁是否还存在,如果存在就延长锁的过期时间,防止锁过期和提前释放。Redisson的底层原理图:只要线程成功获取到锁,就会启动一个watch dog,它是一个后台线程,每10秒检查一次,如果线程一持有锁,那么它会不断延长锁的生存时间。因此,Redisson是可以解决过期时间到了但是业务还没执行完的问题。

3. redlock

Redlock核心思想是这样的:部署多个redis master节点,确保它们不会同时宕机。而且这些主节点之间是完全独立的,它们之间没有数据同步。同时,我们需要确保使用相同的方法来获取和释放锁。具体获取锁和释放锁的步骤大家下去自行研究。

这个redlock主要是解决一个线程在redis的master节点上持有锁,但是 locked key并没有同步到从节点。就在这时,主节点故障,一个从节点将升级为主节点。别的线程就可以拿到相同的锁,这样锁的安全性就没有了。然后redis的作者antirez才提出了一种先进的分布式锁算法,即redlock。

- END -

公粽号:堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

分布式锁的一些细节问题,值得收藏相关推荐

  1. 模具设计整套制造中所需注意细节,值得收藏

    模具设计整套制造中所需注意细节,值得收藏 制造一套好的模具,不仅要有好的模具设计水平和精密的加工工艺,还离不开"标准",不允许"差不多"概念的存在.本文列举了一 ...

  2. 离不开的微服务架构,脱不开的RPC细节(值得收藏)!!!

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 微服务离不开RPC框架,RPC框架的原理.实践及细节,是本篇要分享的内容. 服务化有什么好处? 服务化的一个 ...

  3. redisson的锁的类型_你知道吗?大家都在使用Redisson实现分布式锁了!!

    Redisson框架十分强大,基于Redisson框架可以实现几乎你能想到的所有类型的分布式锁.这里,我就列举几个类型的分布式锁,并各自给出一个示例程序来加深大家的理解.有关分布式锁的原理细节,后续专 ...

  4. 三、基于ZK实现分布式锁

    一.分布式锁介绍 分布式锁主要用于在分布式环境中保护跨进程.跨主机.跨网络的共享资源实现互斥访问,以达到保证数据的一致性. 二.架构介绍 在介绍使用Zookeeper实现分布式锁之前,首先看当前的系统 ...

  5. 跟着大神学zookeeper分布式锁实现-----来自Ruthless

    前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...

  6. 第09课:基于 Etcd 的分布式锁实现原理及方案

    Etcd 最新版本已经提供了支持分布式锁的基础接口(可见官网说明),但本文并不局限于此. 本文将介绍两条实现分布式锁的技术路线: 从分布式锁的原理出发,结合 Etcd 的特性,洞见分布式锁的实现细节: ...

  7. 技术演讲,如何快速做到80分(值得收藏)!!!

    偶尔作为Speaker,参加一些技术大会的演讲,上周被DTCC邀请分享"如何做技术大会演讲",把自己总结的一些经验分享给大家,希望对初登演讲台的技术人有帮助. 一.提前了解听众的诉 ...

  8. 设置公共请求参数_基于分布式锁的防止重复请求解决方案(值得收藏)

    关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求.而这样的重复请求如果是幂等的(每次请求的结果都相同,如查询请求),那其实对于我们没有什么影响,但如果是非幂等的(每次请求都会对 ...

  9. 【建议收藏】细说Redis分布式锁

    正文-开门见山 谈起redis锁,下面三个,算是出现最多的高频词汇: setnx redLock redisson 1.setnx 其实目前通常所说的setnx命令,并非单指redis的setnx k ...

最新文章

  1. ExtJS(3)- 自定义组件(星级评分)
  2. python flask 设置 header 响应体、响应头、状态码
  3. 解决fixed在苹果手机抖动问题/头部底部固定布局
  4. 对象的序列化与反序列化---IO学习笔记(四)
  5. MySQL的join类型
  6. 【转】(五)unity4.6Ugui中文教程文档-------概要-UGUI Interaction Components
  7. 阿里如何做到百万量级硬件故障自愈?
  8. 数组02 - 零基础入门学习C语言24
  9. Django RESTful规范
  10. Ant Design Switch 随机生成bool开关 代码片段
  11. c#的内存管理(托管及未托管对象管理)
  12. Volley源码解析(三)
  13. 运维中常用Linux命令及运维工具
  14. k3cloud6.0文件服务器,K3Cloud系统集成配置详解
  15. 使用STVD开发STM8S时中断的处理方法
  16. [Unity][C#]Regex正则表达式判断字符串
  17. 设定绘图区坐标轴及标题字体、字号的两种方法
  18. css样式表诞生,[css]简明教程 CSS样式表概述
  19. 基础算法(三) --- 轮询
  20. 【Jeoy‘ s daily 】AcWing 1275. 最大数 线段树

热门文章

  1. 关于递归删除链表结点时为什么不会出现断链问题
  2. 投影仿真1.0-二维图像矩阵投影
  3. 专注要事、把手弄脏、高效优雅是对抗规模化焦虑的好办法--读Getting Real(达成现实)和 Rework(重塑工作)
  4. 固态硬盘迁移及0xc00000e错误码解决方案
  5. 【传感器大赏】酒精传感器
  6. 静态路由配置全面详解,静态路由快速入门指南
  7. DCOS之Mesos-DNS介绍
  8. 从pwn-summoner理解first fit
  9. 【MATLAB】基于油猴脚本和MATLAB下载原创力文档
  10. 怎样把PDF格式转换成可编辑的PPT幻灯片?