2024-01-05
中间件
00
请注意,本文编写于 172 天前,最后修改于 35 天前,其中某些信息可能已经过时。

目录

Redisson 简介
SpringBoot整合Redisson
1、引入依赖
2、yml配置Redis
3、测试
3.1. 编写Controller
3.2. 启动2个后端服务
3.3. postman发送请求

今天做了个任务涉及到并发占用问题,比如1张票,有2个后端服务同时去订购这张票,会产生同时抢到这张表,如果是单体架构可以加个锁完成,今天了解到了Redssion分布式锁,记录下使用并测试。

参考资料:

详解 Redis 分布式锁的 5 种方案-腾讯云开发者社区-腾讯云 (tencent.com)

分布式锁中的王者方案-Redisson-腾讯云开发者社区-腾讯云 (tencent.com)

redisson官网

Redisson 简介

Redisson 是一个基于 Redis 的分布式 Java 对象和服务的框架。它提供了一系列的分布式的 Java 编程工具,包括分布式锁、分布式集合、分布式对象等,以简化分布式系统的开发。

SpringBoot整合Redisson

1、引入依赖

官网版本对应:

redisson-spring-data 模块名称Spring Boot 版本
redisson-spring-data-161.3.y
redisson-spring-data-171.4.y
redisson-spring-data-181.5.y
redisson-spring-data-2x2.x.y
redisson-spring-data-3x3.x.y

我的springboot版本是2.4.1,我根据maven仓库查看到对应版本

image-20240104221231953

<!-- https://mvnrepository.com/artifact/org.redisson/redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.16.0</version> </dependency>

2、yml配置Redis

RedissonClient自动将redis配置注册到RedissonClient

spring: redis: host: 192.168.1.173 port: 6379 database: 0

3、测试

3.1. 编写Controller

接口执行输出当前线程,并且睡眠10秒

/** * @author: Chen Shaohua * @Time: 2024/01/04 21:45 */ @RestController @Slf4j public class RedissonController { @Autowired RedissonClient redissonClient; @RequestMapping("/printLock") public String printLock() { RLock lock = redissonClient.getLock("chen-lock"); try { lock.lock(); log.info("加锁,当前线程:" + Thread.currentThread().getName()); Thread.sleep(10000); } catch (Exception e) { log.error("", e); } finally { lock.unlock(); log.info("解锁,当前线程:" + Thread.currentThread().getName()); } return "成功!"; } }

3.2. 启动2个后端服务

image-20240104221910228

3.3. postman发送请求

http://127.0.0.1:8080/printLock http://127.0.0.1:8081/printLock

当顺序分别调用2个接口,首先第一个问题,可以看到8080 执行完成后8081才开始触发,并且可以看到Redis中设置了有效期的key,默认是30s。

如果8080服务加锁之后挂掉了,那么30s后过期们不会导致8081不执行的情况。

image-20240104223144789

本文作者:酷少少

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!