Redisson分布式锁原理

Redisson是基于Redis实现的客户端库,提供了多种Java并发API映射到Redis中,也实现了各种分布式服务,其中就有各种分布式锁的实现。

Redisson锁弥补了SETNX锁的的局限性,实现了可重入、可重试和超时续约的功能。

  • 可重入:利用redis的 hash 结构记录线程 id 和重入次数。每次获取锁时,先判断锁是否存在,如果不存在,则直接获取,如果已经存在,且线程标识为当前线程,则可以再次获取,并将重入次数加 1。释放锁时,每释放一次,重入次数减 1,直至重入次数减为 0,则证明所有的业务已经执行结束,则可以直接释放锁。整个过程是采用lua脚本实现的。

  • 可重试:利用信号量和 PubSub 功能实现等待、唤醒,获取锁失败的重试机制。在第一次尝试获取锁失败后,并不是立即失败,而是去等待释放锁的信号(利用了 Redis 中 PubSub 机制)。而获取锁成功的线程在释放锁的时候,就会向等待中的线程发送一条消息,等待中的线程捕获到消息后,就可以重新尝试获取锁。如果重试失败,则会继续等待释放锁的信号,然后再去重试。当然,重试并不是无限次的,会有一个等待时间,如果超过等待时间,就结束重试。

  • 超时续约:利用 watchDog,每隔一段时间(releaseTime/3),重置超时时间。简单来说,就是在获取锁成功后,会开启一个定时任务,该定时任务每隔一段时间就会重置锁的超时时间,这样锁的超时时间就会重新计时。

参考1
参考2

相关推荐
Wang's Blog7 分钟前
RabbitMQ: 分布式事务消息处理框架之实现可靠消息方案 —— 枚举定义、实体建模、存储层实现与定时任务调度
分布式·rabbitmq
搬砖的kk23 分钟前
Flutter适配鸿蒙:跨平台力量为鸿蒙生态注入增长新动能
分布式·flutter·harmonyos
Wang's Blog32 分钟前
Kafka: 动态配置刷新与分布式配置管理深度实践
分布式·kafka
程序员miki1 小时前
Redis核心命令以及技术方案参考文档(分布式锁,缓存业务逻辑)
redis·分布式·python·缓存
北城以北88881 小时前
RabbitMQ基础知识
spring boot·分布式·rabbitmq·intellij-idea
是阿威啊1 小时前
【第三站】本地虚拟机部署hive集群
linux·数据仓库·hive·hadoop·分布式
云技纵横1 小时前
本地限流与 Redis 分布式限流的无缝切换 技术栈:Sentinel 线程池隔离 + Nginx + Kafka
redis·分布式·sentinel
源代码•宸2 小时前
goframe框架签到系统项目开发(分布式 ID 生成器、雪花算法、抽离业务逻辑到service层)
经验分享·分布式·mysql·算法·golang·雪花算法·goframe
初级炼丹师(爱说实话版)2 小时前
ROS分布式通信和Socket.io通信的区别
分布式
阿方索2 小时前
Ceph 分布式存储
分布式·ceph