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

Redis实战(8) -- 分布式锁Redission底层机制

介绍

Redisson 是基于 Redis 实现的 Java 驻内存数据网格(In-Memory Data Grid),提供了分布式和可扩展的 Java 数据结构,如分布式锁、分布式集合等。

注意如果需要重新实现redission,需要重新设置RedissionClient配置类

底层主要机制

(1)基于LUA脚本进行实现原子性

由于redission的锁操作是需要原子性支持,例如加锁,解锁等,所以其底层实现是使用LUA脚本进行执行。

例如:

if (redis.call('exists', KEYS[1]) == 0) thenredis.call('hincrby', KEYS[1], ARGV[2], 1);redis.call('pexpire', KEYS[1], ARGV[1]);return nil;end;if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) thenredis.call('hincrby', KEYS[1], ARGV[2], 1);redis.call('pexpire', KEYS[1], ARGV[1]);return nil;end;return redis.call('pttl', KEYS[1]);

以上代码是redission中实现加锁代码,主要流程是:

1)检查锁是否存在,不存在则创建且设置对应过期时间

2)如果锁已经存在,则如果是属于当前线程(通过ARGV[2]进行判断是否为当前线程ID),是则增加重入次数

3)发现不是当前线程ID,表明其他人拿到锁,则返回当前锁被持有的剩余时间

(2)锁可重入性设置

同一个线程可以获取同一把锁,通过HSET进行存储锁的持有线程和重入的次数

(3)看门狗自动续期机制

看门狗机制是应对由于操作未执行完毕,但是锁快到期情况,因为人为不好判断当前操作需要多久执行,所以使用看门狗机制,实现守护线程自动判断。如果没有设置对应的锁检查时间,则默认是10s自动检查是否需要续期,而默认续期时间是30s。

实现代码:

private void scheduleExpirationRenewal(final long threadId) {Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {@Overridepublic void run(Timeout timeout) throws Exception {// 执行Lua脚本续期锁renewExpirationAsync(threadId);}}, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS);}

而续期对象则可以实现自定义。自定义看门狗锁:

核心续期操作是:

Config.setLockWatchhdogTimeout(60_000);  //设置时间1分钟

(4)联锁和红锁

Redission实现了MultiLock联锁和RedLock红锁,联锁就是多个独立锁的组合,必须全部获取成功才算加锁成功。而红锁是用于集群环境下,基于过半节点成功才算锁的设置成功,用于缓解单节点故障问题。

单节点故障:由于在主节点加锁,但是同步到从节点时候,主节点宕机,导致数据没有同步到从节点,从节点此时没有锁,所以会导致相关问题。

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

相关文章:

  • 如何解决用阿里云效流水线持续集成部署Nuxt静态应用时流程卡住,进行不下去的问题
  • 基于 MATLAB 的 QPSK 调制、解调、通过高斯信道的误码率计算,并绘制误码率图和眼图、星座图
  • 火山引擎接入豆包AI(纯前端调用api的方式)
  • Java 大视界 -- Java 大数据在智能教育在线课程互动优化与学习体验提升中的应用(386)
  • E频段芯片解决方案
  • npm 与 npx 区别详解。以及mcp中npx加载原理。
  • 2025年生成式大模型部署与推理优化全景解析
  • 14天搞定Excel公式:告别加班,效率翻倍!
  • 【YOLOv8改进 - 上采样】EUCB:(Efficient Up-convolution Block,高效上卷积块)实现特征图尺度匹配和高效上采样
  • 网络编程基石:域名系统与默认端口号详解
  • 文章采集发布Destoon网站技巧
  • C语言函数与预编译:模块化编程的精髓
  • 【AI论文】细胞锻造(CellForge):虚拟细胞模型的智能体化设计
  • 上岸AAAI 2025:自适应框架+前沿算法,顶会热点方向
  • 【VLLM篇】:原理-实现
  • 【论文阅读】基于元模型的体系知识图谱构建
  • spring boot学习计划
  • 什么是AI Agents
  • 机器学习算法篇(四)决策树算法
  • XCZU19EG-2FFVB1517I FPGA Xilinx AMD ZynqUltraScale+ MPSoC
  • 如何验证Go代理是否设置成功?
  • 深入探索C++模板实现的单例模式:通用与线程安全的完美结合
  • SpringBoot的优缺点
  • MyBatis 操作数据库
  • Orange的运维学习日记--33.DHCP详解与服务部署
  • Linux 系统启动、systemd target 与 root 密码重置指南
  • vector模拟实现
  • Seelen UI:高效的设计与原型制作工具
  • 解决winform中的listbox实现拖拽时,遇到combox控件会闪烁的问题
  • APM-SigNoz可观测性系统搭建