当前位置: 首页 > article >正文

Redission分布式锁

实现过程:

只要线程一加锁成功,就会启动一个 watch dog 看门狗,它一个后台线程, 会每隔 10 秒检查一下,如果线程 1 还持有锁,那么就会不断延长锁 key 生存时间。因此,Redisson 解决了锁过期释放,业务没执行完问题。 

Redlock 算法:

 假设有N个Redis master节点,这些节点都是完全独立的。

1、.获取当前时间,以毫秒为单位。

2、轮流用相同的key和随机值在N个节点上请求锁,在这一步里,客户端在每个master上请求锁时,会有一个和总的锁释放时间相比小的多的超时时间。比如如果锁自动释放时间是10秒钟,那每个节点锁请求的超时时间可能是5-50毫秒的范围,这个可以防止一个客户端在某个宕掉的master节点上阻塞过长时间,如果一个master节点不可用了,我们应该尽快尝试下一个master节点。

3、客户端计算第二步中获取锁所花的时间,只有当客户端在大多数master节点(超过一半master)上成功获取了锁,而且总共消耗的时间不超过锁释放时间,这个锁就认为是获取成功了。

4、如果锁获取成功了,那现在锁自动释放时间就是最初的锁释放时间减去之前获取锁所消耗的时间

5、如果锁获取失败了,不管是因为获取成功的锁不超过一半(N/2+1)还是因为总消耗时间超过了锁释放时间,客户端都会到每个master节点上释放锁,即便是那些他认为没有获取成功的锁。

建议:

redlock最好和切片集群搭配使用。


http://www.kler.cn/a/8125.html

相关文章:

  • 高强度螺栓等级划分
  • java如何使用poi-tl在word模板里渲染多张图片
  • leetcode hot100除自身以外的数组的乘积
  • Java爬虫获取1688 item_search_img接口详细解析
  • 深度学习0-前置知识
  • 【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程
  • vue3脚手架Vite
  • ChatGPT常用prompts汇总
  • springboot感受优化06
  • 使用for循环对ArrayList在遍历时删除存在的问题
  • Linux如何在Ubuntu系统服务器上安装 Jenkins?【详细教程】
  • 初识设计模式 - 策略模式
  • 基于SpringBoot+Vue的家政平台
  • 命名空间和程序集
  • Mysql 的B+树索引 和HASH索引
  • 160. 相交链表 ——【Leetcode每日一题】
  • CSS基础知识,必须掌握!!!
  • Android:启动流程
  • 城乡供水一体化管控平台-农村供水监管平台-乡村振兴
  • C++实现多线程
  • 聚类问题的算法总结
  • Nuxt中使用vuex管理组件信息通讯
  • 图像分割技术及经典实例分割网络Mask R-CNN(含基于Keras Python源码定义)
  • 一文看懂多模态大型语言模型GPT-4
  • 设计模式之监听模式
  • 第二章 SpringBoot整合ES7