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

分布式锁原理

1.锁是什么

一个线程拿到锁,另一个线程就拿不到,满足互斥性。

2.Redis的setnx实现

加锁后解锁,但是要先判断是否是当前线程持有的锁,只能释放本线程的锁。

先判断后释放,两步操作Lua实现原子性

3.为什么要给锁加过期时间

如果持有锁的线程挂了,锁过期自动释放,避免其他线程一直阻塞。

4.线程还没执行完业务,但是锁超时释放了,引入看门狗机制

定时给锁续时间

看门狗线程设置为守护线程,如果业务线程挂了,看门狗也会挂

5.为什么要有锁的重入

递归调用的时候使用,如果是一个线程持有的锁,那么可以重入

synchronized内部有计数器:持有+1,释放-1

ReentrantLock基于AQS,AQS内部有一个state计数器记录 

6.分布式锁的实现

 redission底层(hsetnx):redis的hash结构:要锁的业务是Key

                                                                          线程id+UUID=field(集群环境线程id可能重复)

                                                                           重入次数为value  

  用redis的String结构,在服务器内部维护CoucurrentHashMap,map的value计数

7.阻塞线程如何拿到锁

ReentrantLock自旋

redission订阅发布:先订阅锁,锁释放后发送订阅信号,阻塞线程可以持有锁

8.主从节点不同步问题

主节点挂了,重新选的从节点升为主节点,但是没有setnx锁信息,就会误判没加锁。

红锁:半数以上的节点加锁才算枷锁成功,满足互斥性

http://www.dtcms.com/a/182240.html

相关文章:

  • 自主shell命令行解释器
  • 北斗终端设备应用
  • Vue3组件通信 emit 的工作原理
  • CUDA编程——性能优化基本技巧
  • 海盗王64位服务端+32位客户端3.0版本
  • 前端性能优化全攻略:从基础体验到首屏加载的深度实践
  • pytest自动化测试执行环境切换的两种解决方案
  • 批量修改json文件中的标签
  • 【Linux基础】网络相关命令
  • 202536 | KafKa生产者分区写入策略+消费者分区分配策略
  • 深入解析进程地址空间:从虚拟到物理的奇妙之旅
  • 通过推测搜索加速大型语言模型推理 (SpecSearch) 论文总结
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)
  • 【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
  • 神经网络极简入门技术分享
  • 【入门】数字走向I
  • 数字信号处理|| 离散系统的冲激响应和阶跃响应
  • Web3 学习全流程攻略
  • CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发
  • 【AI大模型学习路线】第一阶段之大模型开发基础——第五章(提示工程技术-2)Active-prompt。
  • JavaScript 数组去重:11 种方法对比与实战指南
  • 每天五分钟机器学习:KTT条件
  • QMK自定义4*4键盘固件创建教程:最新架构详解
  • HTTP 的发展史:从前端视角看网络协议的演进
  • Spring 必会之微服务篇(2)
  • Unity Shaders and Effets Cookbook
  • 汽车四缸汽油机曲柄连杆机构设计关键技术研究
  • 测试左移系列-产品经理实战-实战认知1
  • SpringCloud之Gateway基础认识-服务网关
  • 搜索与图论