「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。PS:已经更文多少天,N就写几。一定要写对文案,否则文章不计入在内。
前言
Hello 大家好,我是l拉不拉米
,今天给大家分享redisson实现的多类型锁、支持几乎所有加锁场景的redis分布式锁的实现,还支持小型MQ和redis的各种数据操作,完整源码可以加我私聊。
本文已收录到 Github-java3c ,里面有我的系列文章,欢迎大家Star。
理论部分
在之前的文章Redis分布式锁中,介绍了通过redis实现分布锁的两种方式,分别是:
- 通过redis自带的命令:setNX
- 通过redis的客户端:redisson
作者更加推荐使用redisson客户端的方式,因为redisson支持更多的锁类型,譬如联锁、红锁、读写锁、公平锁等,而且redisson的实现更加简单,开发者只需要调用响应的API
即可,无需关心底层加锁的过程和解锁的原子性
问题。
在Redis分布式锁中,列出了redisson对于多种的锁类型的简单实现,即编程式实现。这样的实现完全能够满足我们的日常开发需求,但是缺点也很明显。
譬如:
- 代码嵌入较多,不够优雅
- 重复代码
- 对锁的参数运用不直观
- 容易忘掉解锁的步骤
使用过Spring的同学,肯定都知道@Transactional注解,Spring即支持编程式事务,也支持注解式(声明式)事务。
我们是否也可以参考这样的实现呢?
答案是:完全OK!
AOP
就是专门干这种事的。
实战部分
1、引入redisson依赖
1 | xml复制代码<dependency> |
2、自定义注解
1 | java复制代码/** |
3、常量类
1 | java复制代码/** |
4、枚举
1 | java复制代码/** |
5、自定义异常
1 | java复制代码/** |
6、AOP切面
1 | java复制代码 /** |
这里使用了策略模式
来对不同的锁类型提供实现。
7、锁策略的实现
先定义锁策略的抽象基类(也可以用接口):
1 | java复制代码/** |
再提供各种锁模式的具体实现:
- 可重入锁:
1 | java复制代码/** |
- 公平锁:
1 | java复制代码/** |
- 联锁
1 | java复制代码/** |
- 红锁
1 | java复制代码/** |
- 读锁
1 | java复制代码/** |
- 写锁
1 | java复制代码/** |
最后提供一个策略工厂初始化锁策略:
1 | java复制代码/** |
8、使用方式
1 | java复制代码 @Lock(keys = "#query.channel") // 支持spel |
大功告成,顺利吃鸡)
)
本文转载自: 掘金