一、redisson的定位是什么?
对于redis实现分布式锁的方式而言,最大的优点就是基于redisson的API来实现。所以,这篇我们从什么是redisson开始。
官方文档
官网
功能说明:Redis Java Client with features of In-Memory Data Grid(具有内存数据网格功能的Redis Java客户端)
功能
- Redis configurations
- 提供各个redis场景的配置
- Managed Redis services support
- 支持管理redis服务
- Engine
- 提供redis各个开发形式的接口引擎
- Distributed Java objects
- 提供分布式的Java对象
- Distributed Java locks and synchronizers
- Java分布式锁和同步器
- Distributed Java services
- 分布式Java服务
- Distributed Java collections
- 分布式Java集合
- Integration with Java frameworks
- 与Java框架集成
- Supported codecs
- 支持多种编码器
当然,正如redisson的flag所表述的,目的就是满足日益渐增的将redis作为存储来使用的需求
使用场景
- Scaling Java applications
- 可扩展应用程序
- Caching
- 缓存
- Data source caching
- 数据源缓存
- Distributed Java tasks scheduling and execution
- 分布式Java任务调度和执行
- Distributed data processing
- 分布式数据处理
- Easy Redis Java client
- Redis Java Client
- Web session clustering
- web session管理器
- Messaging
- 发布/订阅消息
Github
当然了,本文的重心是redisson分布式锁,具体的redisson就不再概述了
二、redisson实现redis可重入分布式锁
实现代码
1 | arduino复制代码public class ReentrantLock { |
主要涉及到几个文档中的几个点:
- 如何去配置一个cluster mode的config并获取redisson client github.com/redisson/re…
- 如何去构建一个RLock github.com/redisson/re…
简单说明
简单对上面涉及到的两个文档的地方说明一下
Config
- 集群模式可以支持几乎所有的服务,包括 AWS ElastiCache Cluster 和Azure Redis Cache
- 可配置的参数
- checkSlotsCoverage
- nodeAddresses
scanInterval
扫描间隔,应该是感觉起来是用在watchdog
的机制里的,后面关注一下- slots 分布式对象的分片数量
readMode
默认值slave,也就是默认读写分离的- subscriptionMode
- loadBalancer 负载均衡的参数
- ……还有很多
构建RLock
- RLock构建的基础是Java对象中的Lock锁
- redisson实现的锁会出现一个问题,就是获取到锁的实例如果崩溃了,那么这个锁就可能永远挂在获取状态。与此同时,提出了一个解决的方法
watchdog
,主要核心的作用是如果redisson客户端是存活的状态,就会去不停的对锁进行续约,默认锁定看门狗超时为 30 秒,可以通过Config.lockWatchdogTimeout
设置更改。
- Redisson还允许在获取锁时指定
leaseTime
参数,在指定的时间间隔后,锁定的锁将自动释放 - RLock 对象的行为符合 Java Lock 规范。这意味着只有锁的owner线程可以解锁它,否则会抛出 IllegalMonitorStateException。否则考虑使用 RSemaphore 对象。
后面可以比较重点关注这个 watchdog 的机制,包括leaseTime等等
本文转载自: 掘金