当前位置: 首页 > news >正文

一个强大的分布式锁框架——Lock4j

一、简介

Lock4j是一个分布式锁组件,它提供了多种不同的支持以满足不同性能和环境的需求,基于Spring AOP的声明式和编程式分布式锁,支持RedisTemplate、Redisson、Zookeeper。

二、特性

• 简单易用,功能强大,扩展性强。

• 支持redission, redisTemplate, zookeeper,可混用,支持扩展。

开源地址:

https://gitee.com/baomidou/lock4j

三、使用前准备
3.1 引入依赖

<!-- Lock4j -->
<!-- 若使用redisTemplate作为分布式锁底层,则需要引入 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
<version>2.2.4</version>
</dependency>
<!-- 若使用redisson作为分布式锁底层,则需要引入 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
<version>2.2.4</version>
</dependency>

3.2 添加redis配置

spring:redis:
database:0Redis服务器地址 写你的ip
host:127.0.0.1
Redis服务器连接端口
port:6379
Redis服务器连接密码(默认为空)
password:
连接池最大连接数(使用负值表示没有限制  类似于mysql的连接池
jedis:
pool:
max-active:200
连接池最大阻塞等待时间(使用负值表示没有限制) 表示连接池的链接拿完了 现在去申请需要等待的时间
max-wait:-1
连接池中的最大空闲连接
max-idle:10
连接池中的最小空闲连接
min-idle:0
连接超时时间(毫秒) 去链接redis服务端
timeout: 6000

四、注解属性介绍

package com.baomidou.lock.annotation;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public@interfaceLock4j{
Stringname()default"";Class<?extendsLockExecutor> executor()defaultLockExecutor.class;String[] keys()default{""};longexpire()default-1L;longacquireTimeout()default-1L;booleanautoRelease()defaulttrue;
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b1e6f4bbbe74069936e13d53233e80b.png)
### 五、简单使用```java
@GetMapping("/lockMethod")
@Lock4j(keys = {"#key"}, acquireTimeout = 1000, expire = 10000)
publicResultlockMethod(@RequestParam String key){
ThreadUtil.sleep(5000);
returnResult.OK(key);
}

异常,通过全局异常处理返回如下结果:

{
"success":false,
"message":"操作失败,request failed,please retry it.",
"code":500,
"result":null,
"timestamp":1678866034929
}

六、高级使用

6.1 自定义执行器Exector

/*** 自定义分布式锁执行器** @author: austin* @since: 2023/3/15 15:45*/
@Component
publicclassCustomRedissonLockExecutorextendsAbstractLockExecutor{@Override
publicObjectacquire(String lockKey, String lockValue, long expire, long acquireTimeout){
returnnull;
}@Override
publicbooleanreleaseLock(String key, String value, Object lockInstance){
returnfalse;
}
}
在注解上直接指定特定的执行器:@Lock4j(executor = CustomRedissonLockExecutor.class)

6.2 自定义分布式锁key生成器

/*** 自定义分布式锁key生成器** @author: austin* @since: 2023/3/15 15:46*/
@Component
publicclassCustomKeyBuilderextendsDefaultLockKeyBuilder{publicCustomKeyBuilder(BeanFactory beanFactory){
super(beanFactory);
}
}

6.3 自定义抢占锁失败执行策略

/*** 自定义抢占锁失败执行策略** @author: austin* @since: 2023/3/15 15:49*/
@Component
publicclassGrabLockFailureStrategyimplementsLockFailureStrategy{@Override
publicvoidonLockFailure(String key, Method method, Object[] arguments){}
}
默认的锁获取失败策略为 com.baomidou.lock.DefaultLockFailureStrategy.

6.4 手动加锁释放锁

@Service
publicclassLockServiceImplimplementsLockService{@Autowired
privateLockTemplate lockTemplate;@Override
publicvoidlock(String resourceKey){LockInfolock= lockTemplate.lock(resourceKey,10000L,2000L,CustomRedissonLockExecutor.class);
if(lock ==null){
// 获取不到锁
thrownewFrameworkException("业务处理中,请稍后再试...");
}
// 获取锁成功,处理业务
try{doBusiness();
}catch(Exception e){
thrownewRuntimeException(e);
}finally{lockTemplate.releaseLock(lock);
}
}privatevoiddoBusiness(){
// TODO 业务执行逻辑
}
}

相关文章:

  • 定位线上同步锁仍然重复扣费的Bug定位及Redis分布式锁解决方案
  • JDK 为什么需要配置环境变量
  • 单片机IO
  • 项目实战--Spring Boot + Minio文件切片上传下载
  • PyTorch(六)优化模型参数
  • 2.2.5 C#中显示控件BDPictureBox 的实现----ROI交互续2
  • Golang中defer和return顺序
  • LabVIEW幅频特性测试系统
  • 前端工程化08-新的包管理工具pnpm
  • python系列30:各种爬虫技术总结
  • MySQL增删改查
  • Java Nio核心概念理解
  • 关于 Mybatis 的开启二级缓存返回对象不一致问题
  • 嵌入式PCB制图面试题及参考答案(2万字长文)
  • 【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例应用
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS从零开始部署Nodejs项目
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • flask接收请求并推入栈
  • GraphQL学习过程应该是这样的
  • Java反射-动态类加载和重新加载
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux后台研发超实用命令总结
  • Node项目之评分系统(二)- 数据库设计
  • Spark学习笔记之相关记录
  • Spring Cloud中负载均衡器概览
  • Spring核心 Bean的高级装配
  • windows下如何用phpstorm同步测试服务器
  • 搭建gitbook 和 访问权限认证
  • 服务器从安装到部署全过程(二)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端之Sass/Scss实战笔记
  • 前端自动化解决方案
  • 什么软件可以剪辑音乐?
  • 新书推荐|Windows黑客编程技术详解
  • C# - 为值类型重定义相等性
  • 积累各种好的链接
  • 整理一些计算机基础知识!
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (33)STM32——485实验笔记
  • (LeetCode 49)Anagrams
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (转)h264中avc和flv数据的解析
  • (转)创业的注意事项
  • (转载)Linux 多线程条件变量同步
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .htaccess配置常用技巧