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

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

acd3b26f164397f9d049b19e20e881ba.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7210653822850547770

7f5e20ab03c4beb6c5f456fa34da10a4.jpeg


一、简介

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、特性

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

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

开源地址:

https://gitee.com/baomidou/lock4j

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、使用前准备

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;
}
435ab217ce150a20c601481f8e2ac1ce.png

五、简单使用

@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 业务执行逻辑
    }
}

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

c77e69db67b4403e7a079be4e16add3b.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

4208e6f8be97e7da60755412a2298f83.png

19579681c32fe157e2b3170357191f2c.png18f3321af10f469faaf0075f67512018.pnged27310b22a51d7215ae6936c13dcc94.pngb53b239e475e4909fa106b1c84b2c3f5.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值