当前位置: 首页 > 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.lryc.cn/news/613402.html

相关文章:

  • LVDS系列24:Xilinx Ultrascale系ISERDESE3原语(二)
  • 【数据结构——并查集】
  • 批量获取亚马逊商品SKU商品规格调用流程
  • 哈勃网络计划大规模升级卫星以创建全球蓝牙层
  • 哈希表——指针数组与单向链表的结合
  • [Oracle] FLOOR()函数
  • 2025最新国内服务器可用docker源仓库地址大全(2025年8月更新)
  • 上海一家机器人IPO核心零部件依赖外购, 募投计划频繁修改引疑
  • 【Linux基础知识系列】第八十八篇 - 使用du命令分析文件和目录大小
  • 如何解决用阿里云效流水线持续集成部署Nuxt静态应用时流程卡住,进行不下去的问题
  • 硬盘哨兵pe版本 v25.70.6 中文免费版
  • openGauss3.10企业版单机部署(openEuler20.03 SP3)
  • RP2040下的I2S Slave Out,PIO状态机(四)
  • HMC1119LP4METR ADI亚德诺 高频功率放大器 MMIC集成电路IC
  • 自动化测试篇--BUG篇
  • Android-Kotlin基础(Jetpack④-Room)
  • RepoCoder:仓库级代码补全的迭代检索生成框架解析与应用前沿
  • 前缀和
  • 网卡名eth1、em1 、eno1、ens1 的区别
  • C++ vector 扩容时到底发生了什么?
  • 纯本地AI知识库搭建:DeepSeek-R1+AnythingLLM全流程
  • priority_queue的使用和模拟
  • Kotlin中String的==相等比较符
  • C语言sprintf、strcmp、strcpy、strcat函数详解:字符串操作的核心工具
  • 「日拱一码」045 机器学习-因果发现算法
  • 力扣238:除自身之外数组的乘积
  • LeetCode算法日记 - Day 4: 三数之和、四数之和
  • 力扣300:最长递增子序列
  • 优选算法 力扣 LCR 179. 查找总价格为目标值的两个商品 双指针降低时间复杂度 C++题解 每日一题
  • Cesium粒子系统模拟风场动态效果