redisson中的分布式锁解读(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: redisson中的分布式锁解读

概述

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅 提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便 捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用 者能够将精力更集中地放在处理业务逻辑上。

官方文档地址:https://github.com/redisson/redisson/wiki

简单配置使用

pom.xml导入依赖

1. <dependency>
2. <groupId>org.redisson</groupId>
3. <artifactId>redisson</artifactId>
4. <version>3.11.2</version>
5. </dependency>

添加配置

1. @Configuration
2. public class RedissonConfig {
3.    @Bean
4.    public RedissonClient redissonClient(){
5.        Config config = new Config();
6.        // 可以用"rediss://"来启用SSL连接
7.         config.useSingleServer().setAddress("redis://172.16.116.100:6379");
8.        return Redisson.create(config);
9.    }
10. }

代码中使用

1. @Autowired
2. private RedissonClient redissonClient;
3. 
4. public void checkAndLock() {
5. // 加锁,获取锁失败重试
6. RLock lock = this.redissonClient.getLock("lock");
7.         lock.lock();
8. // 先查询库存是否充足
9. Stock stock = this.stockMapper.selectById(1L);
10. // 再减库存
11. if (stock != null && stock.getCount() > 0) {
12.             stock.setCount(stock.getCount() - 1);
13. this.stockMapper.updateById(stock);
14.         }
15. // 释放锁
16.         lock.unlock();
17.     }

可重入锁(Reentrant Lock)

基于Redis的Redisson分布式可重入锁 RLock Java对象实现了 java.util.concurrent.locks.Lock接口。 大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态 时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗, 它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗检查锁的超时时间 是30秒钟,也可以通过修改 Config.lockWatchdogTimeout 来另行指定。

RLock 对象完全符合Java的Lock规范。也就是说只有拥有锁的进程才能解锁,其他进程解锁则会抛出IllegalMonitorStateException 错误。 另外Redisson还通过加锁的方法提供了 leaseTime 的参数来指定加锁的时间。超过这个时间后锁便自 动解开了。

1. RLock lock = redisson.getLock("anyLock");
2. // 最常见的使用方法
3. lock.lock();
4. // 加锁以后10秒钟自动解锁
5. // 无需调用unlock方法手动解锁
6. lock.lock(10, TimeUnit.SECONDS);
7. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
8. boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
9. if (res) {
10.   try {
11.      ...
12.    } finally {
13.        lock.unlock();
14.    }
15. }

公平锁(Fair Lock)

基于Redis的Redisson分布式可重入公平锁也是实现了 java.util.concurrent.locks.Lock 接口的一

种 RLock 对象。同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒

1. RLock fairLock = redisson.getFairLock("anyLock");
2. // 最常见的使用方法
3. fairLock.lock();
4. // 10秒钟以后自动解锁
5. // 无需调用unlock方法手动解锁
6. fairLock.lock(10, TimeUnit.SECONDS);
7. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
8. boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);
9. fairLock.unlock();

联锁(MultiLock)

基于Redis的Redisson分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的Redisson实例。

1. RLock lock1 = redissonInstance1.getLock("lock1");
2. RLock lock2 = redissonInstance2.getLock("lock2");
3. RLock lock3 = redissonInstance3.getLock("lock3");
4. RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
5. // 同时加锁:lock1 lock2 lock3
6. // 所有的锁都上锁成功才算成功。
7. lock.lock();
8. ...
9. lock.unlock();

红锁(RedLock)

基于Redis的Redisson红锁 RedissonRedLock 对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个 RLock 对象关联为一个红锁,每个 RLock 对象实例可以来自于不同的Redisson实例。

1. RLock lock1 = redissonInstance1.getLock("lock1");
2. RLock lock2 = redissonInstance2.getLock("lock2");
3. RLock lock3 = redissonInstance3.getLock("lock3");
4. RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
5. // 同时加锁:lock1 lock2 lock3
6. // 红锁在大部分节点上加锁成功就算成功。
7. lock.lock();
8. ...
9. lock.unlock();

读写锁(ReadWriteLock)

基于Redis的Redisson分布式可重入读写锁 RReadWriteLock Java对象实现了

java.util.concurrent.locks.ReadWriteLock 接口。其中读锁和写锁都继承了RLock接口。分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。

1. RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
2. // 最常见的使用方法
3. rwlock.readLock().lock();
4. // 或
5. rwlock.writeLock().lock();
6. // 10秒钟以后自动解锁
7. // 无需调用unlock方法手动解锁
8. rwlock.readLock().lock(10, TimeUnit.SECONDS);
9. // 或
10. rwlock.writeLock().lock(10, TimeUnit.SECONDS);
11. // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
12. boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
13. // 或
14. boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
15. ...
16. lock.unlock();


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
Java 编译器 数据库
Spring Boot 整合 redisson 实现分布式锁
Spring Boot 整合 redisson 实现分布式锁
55 1
|
9月前
|
运维 NoSQL 安全
Redisson分布式锁最基础内容
Redisson分布式锁最基础内容
64 0
|
9天前
|
NoSQL Redis
redis分布式锁redisson
底层会尝试去加锁,如果加锁失败,会睡眠,自旋加锁,直到获取到锁为止。
15 1
|
6天前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
27 0
|
27天前
|
缓存 NoSQL 安全
玩转Redis!非常强大的Redisson分布式集合,少写60%代码
Redisson是Java的Redis客户端,提供实时数据平台服务,简化了分布式环境下的数据管理。它包含RList、RSet、RMap等分布式集合,支持ConcurrentMap和Set接口,确保线程安全和数据一致性。例如,RMap实现了本地缓存和监听器功能,允许数据监听和本地加速读取。此外,还提供了RSet的排序和去重功能,以及RQueue和RBlockingQueue等队列实现,支持阻塞操作。通过Redisson,开发者能轻松处理分布式系统的数据同步和操作。
|
7天前
|
监控 NoSQL Java
【面试高频 time:】SpringBoot整合Redisson实现分布式锁
【面试高频 time:】SpringBoot整合Redisson实现分布式锁
9 0
|
2月前
|
NoSQL Java Redis
分布式延时消息的另外一种选择 Redisson (推荐使用)
分布式延时消息的另外一种选择 Redisson (推荐使用)
213 1
|
2月前
|
编解码 NoSQL Java
Springboot框架使用redisson实现分布式锁
Redisson是官方推荐的Java Redis客户端,提供丰富的功能,包括默认的分布式锁支持。它可以无缝替代Spring Boot 2.x的Letture客户端,不影响原有RedisTemplate和Redis Repository的使用。集成包括spring-boot-starter-data-redis和redisson-spring-boot-starter,后者需排除默认的redisson-spring-data-23以匹配Spring Data Redis v.2.2.x。
|
2月前
|
运维 NoSQL Java
【Redis】6、Redisson 分布式锁的简单使用(可重入、重试机制...)
【Redis】6、Redisson 分布式锁的简单使用(可重入、重试机制...)
225 1
|
2月前
|
存储 NoSQL Java
Redisson实现分布式锁
Redisson实现分布式锁
53 0