当前位置: 首页 > 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锁信息,就会误判没加锁。

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

相关文章:

  • 自主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。
  • 傅利叶提出下个十年战略,CEO顾捷:机器人要有温度,要用实际价值来定义形态
  • 印度军方否认S-400防空系统被摧毁
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 数理+AI+工程,上海交大将开首届“笛卡尔班”招生约20名
  • 长江画派创始人之一、美术家鲁慕迅逝世,享年98岁
  • 上海杨浦:优秀“博主”购房最高可获200万补贴