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

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

添加StockController方法:

1. @GetMapping("test/read")
2. public String testRead(){
3. String msg = stockService.testRead();
4. return "测试读";
5.     }
6. @GetMapping("test/write")
7. public String testWrite(){
8. String msg = stockService.testWrite();
9. return "测试写";
10.     }

添加StockService方法:

1. public String testRead() {
2. RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
3.     rwLock.readLock().lock(10, TimeUnit.SECONDS);
4.     System.out.println("测试读锁。。。。");
5. // rwLock.readLock().unlock();
6. return null;
7. }
8. public String testWrite() {
9. RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
10.     rwLock.writeLock().lock(10, TimeUnit.SECONDS);
11.     System.out.println("测试写锁。。。。");
12. // rwLock.writeLock().unlock();
13. return null;
14. }

打开开两个浏览器窗口测试:

  • 同时访问写:一个写完之后,等待一会儿(约10s),另一个写开始
  • 同时访问读:不用等待
  • 先写后读:读要等待(约10s)写完成
  • 先读后写:写要等待(约10s)读完成

信号量(Semaphore)

基于Redis的Redisson的分布式信号量(Semaphore)Java对象 RSemaphore 采用了与

java.util.concurrent.Semaphore 相似的接口和用法。同时还提供了异步(Async)、反射式

(Reactive)和RxJava2标准的接口。

1. RSemaphore semaphore = redisson.getSemaphore("semaphore");
2. semaphore.acquire();
3. semaphore.release();

在StockController添加方法:

1. @GetMapping("test/semaphore")
2. public String testSemaphore(){
3. this.stockService.testSemaphore();
4. return "测试信号量";
5. }

在StockService添加方法:

1. public void testSemaphore() {
2. RSemaphore semaphore = this.redissonClient.getSemaphore("semaphore");
3.         semaphore.trySetPermits(3);
4. try {
5.             semaphore.acquire();
6.             TimeUnit.SECONDS.sleep(5);
7.             System.out.println(System.currentTimeMillis());
8.             semaphore.release();
9.         } catch (InterruptedException e) {
10.             e.printStackTrace();
11.         }
12.     }

添加测试用例:并发10次,循环一次

控制台效果:

由此可知:

  • 1606960790秒有3次请求进来:每个控制台各1次
  • 1606960795秒有3次请求进来:控制台2有1次,控制台3有2次
  • 1606960800秒有3次请求进来:控制台1有2次,控制台2有1次
  • 1606960805秒有1次请求进来:控制台1有1次

闭锁(CountDownLatch)

基于Redisson的Redisson分布式闭锁(CountDownLatch)Java对象 RCountDownLatch 采用了与

java.util.concurrent.CountDownLatch 相似的接口和用法。

1. RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
2. latch.trySetCount(1);
3. latch.await();
4. // 在其他线程或其他JVM里
5. RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
6. latch.countDown();

需要两个方法:一个等待,一个计数countDown

给StockController添加测试方法

1. @GetMapping("test/latch")
2. public String testLatch(){
3. this.stockService.testLatch();
4. return "班长锁门。。。";
5.     }
6. @GetMapping("test/countdown")
7. public String testCountDown(){
8. this.stockService.testCountDown();
9. return "出来了一位同学";
10.     }

给StockService添加测试方法

1. public void testLatch() {
2. RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
3.         latch.trySetCount(6);
4. try {
5.             latch.await();
6.         } catch (InterruptedException e) {
7.             e.printStackTrace();
8.         }
9.     }
10. 
11. public void testCountDown() {
12. RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
13.         latch.trySetCount(6);
14.         latch.countDown();
15.     }

重启测试,打开两个页面:当第二个请求执行6次之后,第一个请求才会执行。

总结

redisson:redis的java客户端,分布式锁

   玩法:

       1.引入依赖

       2.java配置类:RedissonConfig

           @Bean

           public RedissonClient redissonClient(){

               Config config = new Config();

               config.useSingleServer().setAddress("redis://ip:port");

               return Redisson.create(config);

           }

       3.代码使用:

           可重入锁RLock对象:CompletableFuture + lua脚本 + hash

               RLock lock = this.redissonClient.getLock("xxx");

               lock.lock()/unlock()

               

           公平锁:

               RLock lock = this.redissonClient.getFairLock("xxx");

               lock.lock()/unlock()

               

           联锁 和 红锁:

           

           读写锁:

               RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("xxx");

               rwLock.readLock().lock()/unlock();

               rwLock.writeLock().lock()/unlock();

               

           信号量:

               RSemaphore semaphore = this.redissonClient.getSemaphore("xxx");

               semaphore.trySetPermits(3);

               semaphore.acquire()/release();

               

           闭锁:

               RCountDownLatch cdl = this.redissonClient.getCountDownLatch("xxx");

               cdl.trySetCount(6);

               cdl.await()/countDowntch();

相关实践学习
基于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
相关文章
|
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