Redisson分布式锁----源码详解(三)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redisson分布式锁----源码详解(三)

之前有两篇文章,已经介绍过redisson分布式的代码使用教程,上锁流程。

Redisson分布式锁流程详解(二)

Redisson分布式锁使用实例(一)

 

这篇文章主要详细解析redisson源码。Redis本身就能实现分布式锁,因为他是单线程,并且有天然的幂等性,互斥性,通过setNx也能加锁,处理好释放锁的逻辑即可,Redisson可以理解为redis的高级管理端。

 

Redisson有lock和tryLock两种上锁方法:


Lock:直接加锁,若锁被占用,则进入阻塞,一直等到锁被释放为止。

tryLock:返回true或false,可以设置获取锁的等待超时时间,若锁被其他线程获取,则在等待时间内一直尝试加锁,超过等待时间,则返回false,获取失败。

接下来看tryLock源码:

image.png


从源码我们可以看到,主要逻辑就是获取锁,判断其他线程是否获取锁,若获取了就重复尝试获取,然后期间有若干超时判断:


1、先是tryAcquire方法尝试获取锁,若其他线程未获取,则直接返回null,直接返回true加锁成功。

2、若其他线程获取了锁,则返回其他线程的获取锁时间。然后看自己当前锁是否超时,未超时则进入死循环继续尝试获取锁。

image.png


tryAcquire方法干嘛的呢?  上图就是在此方法里的代码,该方法里面主要和redis通信,用lua封装复杂的业务逻辑发给redis,若key没有上锁,则返回null,上锁了,则返回超时时间。

image.png

这个waiting for message 是干什么的呢?


waitTimeredis锁住的key的超时时间大小做比较,取二者中比较小的值,用javaSemaphore信号量tryAcquire方法来阻塞线程,Semaphore是由上面的代码subscribe方法控制的。


subscribe方法,它会进入到PublishSubscribe.java,当前的线程ID添加到AsyncSemaphore,并且设置redis的监听器,这个监听器是通过redis的发布、订阅功能实现的, 一旦监听器收到redis发来的消息,就从中获取与当前thread相关的消息,如果是锁被释放的消息,就立马通过操作Semaphore来让刚才阻塞的地方释放


如果锁重入了怎么办呢,比如同一个线程,两次tryLock,怎么保证全部都能释放锁?

lua脚本有两个if,第一个if如果成立,则会加锁成功,因为现在已经是重入锁,第二次加锁了,所以第一个if判断肯定不成立,第二个if会获取当前客户端的ID,这时候会执行可重入锁的逻辑,对当前客户端累计加1。释放锁的时候如何释放呢,其实就是unlock,每次对统计的加锁数量减1,若为0了,则del myLock,在redis里删除这个key

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
Java 编译器 数据库
Spring Boot 整合 redisson 实现分布式锁
Spring Boot 整合 redisson 实现分布式锁
128 1
|
3天前
|
供应链 NoSQL Java
关于Redisson分布式锁的用法
Redisson分布式锁是实现分布式系统中资源同步的有效工具。通过合理配置和使用Redisson的各种锁机制,可以确保系统的高可用性和数据一致性。本文详细介绍了Redisson分布式锁的配置、基本用法和高级用法,并提供了实际应用示例,希望对您在实际项目中使用Redisson分布式锁有所帮助。c
27 10
|
5月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
7月前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
6月前
|
NoSQL Redis
redis分布式锁redisson
底层会尝试去加锁,如果加锁失败,会睡眠,自旋加锁,直到获取到锁为止。
61 1
|
2月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
69 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
2月前
|
NoSQL Java Redis
开发实战:使用Redisson实现分布式延时消息,订单30分钟关闭的另外一种实现!
本文详细介绍了 Redisson 延迟队列(DelayedQueue)的实现原理,包括基本使用、内部数据结构、基本流程、发送和获取延时消息以及初始化延时队列等内容。文章通过代码示例和流程图,逐步解析了延迟消息的发送、接收及处理机制,帮助读者深入了解 Redisson 延迟队列的工作原理。
|
3月前
|
缓存 NoSQL Java
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
缓存与分布式锁、Redisson分布式锁、缓存数据一致性【必须满足最终一致性】
153 14
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
246 0
|
7月前
|
关系型数据库 分布式数据库 数据库
【PolarDB开源】PolarDB-X源码解读:分布式事务处理机制揭秘
【5月更文挑战第20天】PolarDB-X,PolarDB家族的一员,专注于大规模分布式事务处理,采用2PC协议保证ACID特性。源码解析揭示其通过预提交、一致性快照隔离和乐观锁优化事务性能,以及利用事务日志进行故障恢复。深入理解其事务处理机制对开发者掌握分布式数据库核心技术至关重要。随着开源社区的发展,更多优化方案将涌现,助力构建更强大的分布式数据库系统。
230 6
下一篇
DataWorks