👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
截止目前,累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有1800+小伙伴加入
一、简介
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:0
# Redis服务器地址 写你的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;
}
五、简单使用
@RestController
@RequestMapping("/mock")
publicclassMockController{
@GetMapping("/lockMethod")
@Lock4j(keys = {"#key"}, acquireTimeout = 1000, expire = 10000)
publicResultlockMethod(@RequestParam String key){
ThreadUtil.sleep(5000);
returnResult.OK(key);
}
}
打开浏览器窗口,重复刷新访问:
http://localhost:8080/mock/lockMethod?key=123
成功获得锁访问结果:
{
"success":true,
"message":"操作成功!",
"code":200,
"result":"123",
"timestamp":1678866083211
}
抢占不到锁,Lock4j会抛出
com.baomidou.lock.exception.LockFailureException: request failed,please retry it.
异常,通过全局异常处理返回如下结果:
{
"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 业务执行逻辑
}
}
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
截止目前,累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有1800+小伙伴加入
1. 我的私密学习小圈子~
2. 阿里这款多级缓存框架一定要掌握,非常不错!
3. 高级进阶:复杂业务系统的通用架构设计
4. 8 个线程池最佳实践和坑!使用不当直接生产事故!!
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦