分布式锁——Redisson概念篇 一、redisson的定

一、redisson的定位是什么?

对于redis实现分布式锁的方式而言,最大的优点就是基于redisson的API来实现。所以,这篇我们从什么是redisson开始。

官方文档

官网

地址:redisson.org/

功能说明:Redis Java Client with features of In-Memory Data Grid(具有内存数据网格功能的Redis Java客户端)

功能

  1. Redis configurations
  • 提供各个redis场景的配置
  1. Managed Redis services support
  • 支持管理redis服务
  1. Engine
  • 提供redis各个开发形式的接口引擎
  1. Distributed Java objects
  • 提供分布式的Java对象
  1. Distributed Java locks and synchronizers
  • Java分布式锁和同步器
  1. Distributed Java services
  • 分布式Java服务
  1. Distributed Java collections
  • 分布式Java集合
  1. Integration with Java frameworks
  • 与Java框架集成
  1. Supported codecs
  • 支持多种编码器

当然,正如redisson的flag所表述的,目的就是满足日益渐增的将redis作为存储来使用的需求

使用场景

  1. Scaling Java applications
  • 可扩展应用程序
  1. Caching
  • 缓存
  1. Data source caching
  • 数据源缓存
  1. Distributed Java tasks scheduling and execution
  • 分布式Java任务调度和执行
  1. Distributed data processing
  • 分布式数据处理
  1. Easy Redis Java client
  • Redis Java Client
  1. Web session clustering
  • web session管理器
  1. Messaging
  • 发布/订阅消息

Github

地址:github.com/redisson/re…

当然了,本文的重心是redisson分布式锁,具体的redisson就不再概述了

二、redisson实现redis可重入分布式锁

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
arduino复制代码public class ReentrantLock {

public static void main(String[] args) {
Config config = new Config();
config.useClusterServers()
.addNodeAddress("redis://106.12.46.26:7001")
.addNodeAddress("redis://106.12.46.26:7002")
.addNodeAddress("redis://106.12.46.26:7003")
.addNodeAddress("redis://106.12.6.73:7001")
.addNodeAddress("redis://106.12.6.73:7002")
.addNodeAddress("redis://106.12.6.73:7003");
RedissonClient redissonClient = Redisson.create(config);

RLock lock = redisson.getLock("anyLock");
lock.lock();
Thread.sleep(30 * 1000);
lock.unlock();

}
}

主要涉及到几个文档中的几个点:

简单说明

简单对上面涉及到的两个文档的地方说明一下

Config

  1. 集群模式可以支持几乎所有的服务,包括 AWS ElastiCache Cluster 和Azure Redis Cache
  2. 可配置的参数
    • checkSlotsCoverage
    • nodeAddresses
    • scanInterval 扫描间隔,应该是感觉起来是用在watchdog的机制里的,后面关注一下
    • slots 分布式对象的分片数量
    • readMode 默认值slave,也就是默认读写分离的
    • subscriptionMode
    • loadBalancer 负载均衡的参数
    • ……还有很多

构建RLock

  1. RLock构建的基础是Java对象中的Lock锁
  2. redisson实现的锁会出现一个问题,就是获取到锁的实例如果崩溃了,那么这个锁就可能永远挂在获取状态。与此同时,提出了一个解决的方法 watchdog,主要核心的作用是如果redisson客户端是存活的状态,就会去不停的对锁进行续约,默认锁定看门狗超时为 30 秒,可以通过 Config.lockWatchdogTimeout 设置更改。
  1. Redisson还允许在获取锁时指定leaseTime参数,在指定的时间间隔后,锁定的锁将自动释放
  2. RLock 对象的行为符合 Java Lock 规范。这意味着只有锁的owner线程可以解锁它,否则会抛出 IllegalMonitorStateException。否则考虑使用 RSemaphore 对象。

后面可以比较重点关注这个 watchdog 的机制,包括leaseTime等等

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%