基于自定义注解的Redisson分布式锁实现
前言
在项目中,经常需要使用Redisson 分布式锁来保证并发操作的安全性。在未引入基于注解的分布式锁之前,我们需要手动编写获取锁、判断锁、释放锁的逻辑,导致代码重复且冗长。为了简化这一过程,我们引入了基于注解的分布式锁,通过一个注解就可以实现获取锁、判断锁、处理完成后释放锁的逻辑。这样可以大大简化代码,提高开发效率。
文章是在csdn写完,粘过来的,有些格式可能有点问题,尽请见谅!
目标
使用@DistributedLock 即可实现获取锁,判断锁,处理完成后释放锁的逻辑。
涉及知识
- SpringBoot
- Spring AOP
- Redisson
- 自定义注解
- 统一异常处理
- SpEL表达式
代码实现
引入依赖
注解类
切面类
统一异常处理类
还需要将redis配置读入,这里就不体现
使用示例
- 无参方法或者需要加方法级的锁
调用接口:http://localhost:8080/helloWorld
可以看到,无参方法的key为HelloController:helloWorld:,其中HelloController为类名,helloWorld 为方法名,因为是无参方法,所以没有接下来的参数。
这时候,再次调用改接口,则不会再进去接口,会被切面类直接拦截,返回如下结果:
在实际生产使用中,这种情况一般被用来在自动任务上标注,因为在集群环境中自动任务同一时间一般只需要启动一个。
2. 有参数方法,其中key从name中取值
调用接口为:http://localhost:8080/hello1?name=hurry
这时候,再通过hurry这个名称调用时,就不会再处理,而name换为zhangsan 时,则就能正常进入接口。
这时候redis中的key为
实际业务中,需要根据不同的参数值进行加锁的场景。
2. 有参数方法,其中key需要从user对象中获取name
需要从某个对象中获取指定属性作为key的场景
4.有参数方法,其中key从name上取值并指定前缀
需要指定key前缀的场景
最后
由于文章篇幅原因,很多东西没有深入的讲解,但是基于以上代码基本实现了基于注解的分布式锁,可以大大提到开发效率。如果还有其他需要拓展的功能,可以通过在注解类增加属性及在切面类中通过不同的属性进行不同的处理来实现。
#知识碎片#
如果这个文章对你有帮助,请帮忙在原文章下https://blog.csdn.net/weixin_43811294/article/details/134588210点个赞
