专栏|分布式锁系列

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: reidsson

### Redisson


Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还实现了可重入锁(Reentrant Lock)、公平锁(Fair Lock、联锁(MultiLock)、 红锁(RedLock)、 读写锁(ReadWriteLock)等,还提供了许多分布式服务。


![Redisson](Redisson.jpg)


**特性功能**


- 支持 Redis 单节点(single)模式、哨兵(sentinel)模式、主从(Master/Slave)模式以及集群(Redis Cluster)模式

- 程序接口调用方式采用异步执行和异步流执行两种方式

- 数据序列化,Redisson 的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在 Redis 里的读取和存储

- 单个集合数据分片,在集群模式下,Redisson 为单个 Redis 集合类型提供了自动分片的功能

- 提供多种分布式对象,如:Object Bucket,Bitset,AtomicLong,Bloom Filter 和 HyperLogLog 等

- 提供丰富的分布式集合,如:Map,Multimap,Set,SortedSet,List,Deque,Queue 等

- 分布式锁和同步器的实现,可重入锁(Reentrant Lock),公平锁(Fair Lock),联锁(MultiLock),红锁(Red Lock),信号量(Semaphonre),可过期性信号锁(PermitExpirableSemaphore)等

- 提供先进的分布式服务,如分布式远程服务(Remote Service),分布式实时对象(Live Object)服务,分布式执行服务(Executor Service),分布式调度任务服务(Schedule Service)和分布式映射归纳服务(MapReduce)




**Watch dog**


![Redisson分布式锁](Redisson分布式锁.jpg)


总体的Redisson框架的分布式锁类型大致如下:


- **可重入锁**

- **公平锁**

- **联锁**

- **红锁**

- **读写锁**

- **信号量**

- **可过期信号量**

- **闭锁(/倒数闩)**




**实现方案**


添加依赖


```xml

<!-- 方式一:redisson-java -->

<dependency>

   <groupId>org.redisson</groupId>

   <artifactId>redisson</artifactId>

   <version>3.11.4</version>

</dependency>


<!-- 方式二:redisson-springboot -->

<dependency>

   <groupId>org.redisson</groupId>

   <artifactId>redisson-spring-boot-starter</artifactId>

   <version>3.11.4</version>

</dependency>

```


定义接口


```java

import org.redisson.api.RLock;

import java.util.concurrent.TimeUnit;


public interface DistributedLocker {


   RLock lock(String lockKey);


   RLock lock(String lockKey, int timeout);


   RLock lock(String lockKey, TimeUnit unit, int timeout);


   boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);


   void unlock(String lockKey);


   void unlock(RLock lock);

 

}

```


实现分布式锁


```java

import org.redisson.api.RLock;

import org.redisson.api.RedissonClient;


import java.util.concurrent.TimeUnit;


public class RedissonDistributedLocker implements DistributedLocker{


   private RedissonClient redissonClient;


   @Override

   public RLock lock(String lockKey) {

       RLock lock = redissonClient.getLock(lockKey);

       lock.lock();

       return lock;

   }


   @Override

   public RLock lock(String lockKey, int leaseTime) {

       RLock lock = redissonClient.getLock(lockKey);

       lock.lock(leaseTime, TimeUnit.SECONDS);

       return lock;

   }


   @Override

   public RLock lock(String lockKey, TimeUnit unit ,int timeout) {

       RLock lock = redissonClient.getLock(lockKey);

       lock.lock(timeout, unit);

       return lock;

   }


   @Override

   public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {

       RLock lock = redissonClient.getLock(lockKey);

       try {

           return lock.tryLock(waitTime, leaseTime, unit);

       } catch (InterruptedException e) {

           return false;

       }

   }


   @Override

   public void unlock(String lockKey) {

       RLock lock = redissonClient.getLock(lockKey);

       lock.unlock();

   }


   @Override

   public void unlock(RLock lock) {

       lock.unlock();

   }


   public void setRedissonClient(RedissonClient redissonClient) {

       this.redissonClient = redissonClient;

   }

 

}

```




**高可用的RedLock(红锁)原理**


RedLock算法思想是不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁,n / 2 + 1,必须在大多数redis节点上都成功创建锁,才能算这个整体的RedLock加锁成功,避免说仅仅在一个redis实例上加锁而带来的问题。

相关文章
|
Java 数据安全/隐私保护
Java 中使用 OpenSSL 生成公钥私钥进行数据加解密
Java 中使用 OpenSSL 生成公钥私钥进行数据加解密
335 0
|
人工智能 并行计算 搜索推荐
ollama本地部署llama3(window系统)
这篇文章详细介绍了如何在Windows系统上本地部署Ollama框架来运行Llama 3大模型,并提供了具体的安装步骤和注意事项,以便实现离线使用高级AI模型进行对话。
1062 0
ollama本地部署llama3(window系统)
|
监控 Linux 数据处理
探索Linux中的`lsmem`命令:深入了解系统内存布局
`lsmem`是Linux命令,用于显示系统内存布局和大小,帮助管理员和开发者理解内存使用情况。它提供详细输出,包括内存块的大小、范围、类型和关联,支持多种格式展示,如树状图。命令参数如`-h`显示帮助,`-t`以树形展示,`--human-readable`使大小更易读。需root权限运行,常与`free`、`vmstat`等工具结合使用,用于监控和优化内存。注意不同发行版可能存在兼容性差异。
|
存储 缓存 前端开发
浏览器之性能指标-LCP
浏览器之性能指标-LCP
327 0
|
监控 Shell
Shell脚本Ping监控主机是否存活并发邮件报警(三种方法)
Shell脚本Ping监控主机是否存活并发邮件报警(三种方法)
|
存储 内存技术
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
480 0
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
|
前端开发 小程序 JavaScript
微信小程序——模拟时钟案例
微信小程序——模拟时钟案例
922 0
微信小程序——模拟时钟案例
|
弹性计算 固态存储 异构计算
阿里云gpu服务器租用费用
2023阿里云gpu服务器租用费用,阿里云GPU服务器优惠活动,新用户购买GPU服务器价格低至3折,GPU云服务器gn6i实例、GPU云服务器gn6v、GPU云服务器gn7i和GPU云服务器gn7e均有优惠价格,阿里云百科分享阿里云GPU服务器配置、优惠价格、购买条件以及续费折扣说明:
333 0
阿里云gpu服务器租用费用
|
供应链 数据可视化 安全
潜心钻木终得火种,二维火借数据之力驱动行业转型
就BI服务而言,二维火的模式是集成了专业BI厂商的产品能力,凭借自身对于餐饮这一垂直领域的深度理解,实现BI产品、二维火、餐饮企业间系统的完善衔接。一句话来说,就是既要自己用得好,也要客户用得好。
潜心钻木终得火种,二维火借数据之力驱动行业转型