今天做了个任务涉及到并发占用问题,比如1张票,有2个后端服务同时去订购这张票,会产生同时抢到这张表,如果是单体架构可以加个锁完成,今天了解到了Redssion分布式锁,记录下使用并测试。
参考资料:
详解 Redis 分布式锁的 5 种方案-腾讯云开发者社区-腾讯云 (tencent.com)
Redisson 是一个基于 Redis 的分布式 Java 对象和服务的框架。它提供了一系列的分布式的 Java 编程工具,包括分布式锁、分布式集合、分布式对象等,以简化分布式系统的开发。
官网版本对应:
redisson-spring-data 模块名称 | Spring Boot 版本 |
---|---|
redisson-spring-data-16 | 1.3.y |
redisson-spring-data-17 | 1.4.y |
redisson-spring-data-18 | 1.5.y |
redisson-spring-data-2x | 2.x.y |
redisson-spring-data-3x | 3.x.y |
我的springboot版本是2.4.1,我根据maven仓库查看到对应版本
<!-- https://mvnrepository.com/artifact/org.redisson/redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.16.0</version> </dependency>
RedissonClient
自动将redis配置注册到RedissonClient
spring: redis: host: 192.168.1.173 port: 6379 database: 0
接口执行输出当前线程,并且睡眠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 "成功!"; } }
http://127.0.0.1:8080/printLock http://127.0.0.1:8081/printLock
当顺序分别调用2个接口,首先第一个问题,可以看到8080
执行完成后8081
才开始触发,并且可以看到Redis中设置了有效期的key,默认是30s。
如果8080
服务加锁之后挂掉了,那么30s后过期们不会导致8081
不执行的情况。
本文作者:酷少少
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!