当前位置:首页 > 科技  > 软件

SpringBoot强大的分布式锁组件Lock4j,支持多种实现

来源: 责编: 时间:2024-07-12 17:24:11 593观看
导读环境:SpringBoot3.2.51. 简介lock4j是一个分布式锁组件,其提供了多种不同的支持以满足不同性能和环境的需求。底层通过Spring AOP技术实现,而该切面的优先级是最高的,也就是说当你的环境中有多个切面时(如:声明式事务),也不会

环境:SpringBoot3.2.5cZ528资讯网——每日最新资讯28at.com

1. 简介

lock4j是一个分布式锁组件,其提供了多种不同的支持以满足不同性能和环境的需求。底层通过Spring AOP技术实现,而该切面的优先级是最高的,也就是说当你的环境中有多个切面时(如:声明式事务),也不会导致失效问题。该组件具有如下2个特性:cZ528资讯网——每日最新资讯28at.com

  • 简单易用,功能强大,扩展性强。
  • 支持redission,redisTemplate,zookeeper。可混用,支持扩展。

接下来将详细介绍基于Redis的Lock4J使用。cZ528资讯网——每日最新资讯28at.com

2. 实战案例

2.1 引入依赖

<properties>  <lock4j.version>2.2.7</lock4j.version></properties><dependency>  <groupId>com.baomidou</groupId>  <artifactId>lock4j-redis-template-spring-boot-starter</artifactId>  <version>${lock4j.version}</version></dependency>

如果你想基于redisson或者是zookeeper实现,那么你只需要引入对应的包即可。cZ528资讯网——每日最新资讯28at.com

<!-- redisson --><artifactId>lock4j-redisson-spring-boot-starter</artifactId><!-- zookeeper --><artifactId>lock4j-zookeeper-spring-boot-starter</artifactId>
配置文件
spring:  data:    redis:      timeout: 10000      connectTimeout: 20000      host: 127.0.0.1      password: xxxooo  #如果你是基于zookeeper实现,那么做如下配置  coordinate:    zookeeper:      zkServers: 127.0.0.1:2181,...

进过以上的配置后接下来你就可以通过注解的方式使用分布式锁了。cZ528资讯网——每日最新资讯28at.com

2.2 基本使用

@Servicepublic class StorageService {  private final StorageRepository storageRepository ;  public StorageService(StorageRepository storageRepository) {    this.storageRepository = storageRepository ;  }  @Lock4j  public void deductStorage(Long storageId, int count) {    // TODO  }}

使用非常简单,只需要在你需要上锁的方法上添加@Lock4j注解即可。而这里将使用默认行为:默认获取锁超时3秒,30秒锁过期。cZ528资讯网——每日最新资讯28at.com

自定义锁keycZ528资讯网——每日最新资讯28at.com

在上面示例中没有自定义@Lock4j注解的任何属性;那么,将会使用默认的key生成方式,上面的代码将生成如下key。cZ528资讯网——每日最新资讯28at.com

# 前缀 + ":" + 完全限定类名+方法名+# (这里的#是固定的,如果你自定义了key,会在后面继续拼接)lock4j:com.pack.test.lock4j.StorageServicedeductStorage#

当我们自定义了key后如下:cZ528资讯网——每日最新资讯28at.com

@Lock4j(key = "#storageId")public void deductStorage(Long storageId, int count)

key支持Spring SpEL表达式,如上将生成如下的keycZ528资讯网——每日最新资讯28at.com

# 方法调用storageService.deductStorage(1, 2) ;lock4j:com.pack.test.lock4j.StorageServicedeductStorage#1

你也可以不使用SpEL表达式。不使用SpEL表达式那么就需要使用如下语法cZ528资讯网——每日最新资讯28at.com

@Lock4j(keys = "'storageId'")public void deductStorage(...) {}

没有使用单引号程序将会报错。cZ528资讯网——每日最新资讯28at.com

设置过期时间cZ528资讯网——每日最新资讯28at.com

默认获取锁超时3秒,30秒锁过期,可以通过如下属性配置过期时间cZ528资讯网——每日最新资讯28at.com

@Lock4j(keys = {"#storageId"}, expire = 3000, acquireTimeout = 3000)public void deductStorage(Long storageId, int count) {}

expire: 锁过期时间(毫秒);注:锁过期时间必须要大于业务处理时间。acquireTimeout: 获取锁超时时间(毫秒)cZ528资讯网——每日最新资讯28at.com

以上是Lock4j的基本用法;下面将介绍Lock4j其它高级用法。cZ528资讯网——每日最新资讯28at.com

2.3 高级用法

全局统一配置cZ528资讯网——每日最新资讯28at.com

lock4j:  acquire-timeout: 3000   expire: 30000  primary-executor: com.baomidou.lock.executor.RedisTemplateLockExecutor  lock-key-prefix: lock4j

primary-executor:配置加锁的实现方式;默认顺序是:
redisson > redisTemplate > zookeeper;如果你的环境中这3个都引入了,那么就是按照这个顺序,因为定义他们时使用了@Order注解声明顺序。lock-key-prefix:#锁前缀,如上面示例看到的lock4j为默认值。cZ528资讯网——每日最新资讯28at.com

自定义执行器(加锁)cZ528资讯网——每日最新资讯28at.com

我们可以通过实现LockExecutor接口定义自己的加锁实现,比如基于MySQL实现。如下:cZ528资讯网——每日最新资讯28at.com

@Componentpublic class JdbcLockExecutor implements LockExecutor<String> {  private final JdbcTemplate jdbcTemplate ;  public JdbcLockExecutor(JdbcTemplate jdbcTemplate) {    this.jdbcTemplate = jdbcTemplate ;  }  @Override  public String acquire(String lockKey, String lockValue, long expire, long acquireTimeout) {    // TODO; 获取锁    return null ;  }  @Override  public boolean releaseLock(String key, String value, String lockInstance) {    // TODO; 释放锁    return false;  }}

注:这里必须要注册为Spring Bean。否则将无法获取。使用如下:cZ528资讯网——每日最新资讯28at.com

@Lock4j(executor = JdbcLockExecutor.class)public void deductStorage(Long storageId, int count) {}

加锁时会根据这里配置的executor Class对象获取Spring容器对应的bean对象。cZ528资讯网——每日最新资讯28at.com

自定义key生成器cZ528资讯网——每日最新资讯28at.com

Lock4j默认的锁key生成器为DefaultLockKeyBuilder,我们可以通过LockKeyBuilder接口实现自己的key生成方式cZ528资讯网——每日最新资讯28at.com

@Componentpublic class PackLockKeyBuilder implements LockKeyBuilder {  @Override  public String buildKey(MethodInvocation invocation, String[] definitionKeys) {    // TODO; 生成key    return null;  }}

注:这里也必须注册为bean对象。使用如下:cZ528资讯网——每日最新资讯28at.com

@Lock4j(keyBuilderStrategy = PackLockKeyBuilder.class)public void deductStorage(Long storageId, int count) {}

内部会通过你这里配置的Class对象获取对应的Spring Bean实例对象。cZ528资讯网——每日最新资讯28at.com

自定义获取锁失败策略cZ528资讯网——每日最新资讯28at.com

当获取锁失败时如何进行处理?默认实现是DefaultLockFailureStrategy通过自定义LockFailureStrategy,实现自己的逻辑。与上面的套路一样都需要注册为bean。cZ528资讯网——每日最新资讯28at.com

@Componentpublic class PackLockFailureStrategy implements LockFailureStrategy {  @Override  public void onLockFailure(String key, Method method, Object[] arguments) {    // TODO  }}

使用如下:cZ528资讯网——每日最新资讯28at.com

@Lock4j(failStrategy = PackLockFailureStrategy.class)public void deductStorage(Long storageId, int count) {}

注:这里你也可以不指定failStrategy属性,会自动从容器中查找对应的实现Bean。cZ528资讯网——每日最新资讯28at.com

非注解实现方式(手动加锁/释放锁)cZ528资讯网——每日最新资讯28at.com

你也可以通过注入LockTemplate对象,由自己来完成加锁和释放锁的动作。cZ528资讯网——每日最新资讯28at.com

private final LockTemplate lockTemplate ;  public StorageService(LockTemplate lockTemplate) {    this.lockTemplate = lockTemplate ;  }  public void deductStorage(Long storageId, int count) {    String key = "xxxx" ;    final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedisTemplateLockExecutor.class);    if (null == lockInfo) {        throw new RuntimeException("业务处理中,请稍后再试") ;    }    // 获取锁成功,处理业务    try {        // TODO    } finally {        // 释放锁        lockTemplate.releaseLock(lockInfo) ;    }  }}

手动加锁方式,一般适用于需要更细粒度控制锁边界,否则没必要。cZ528资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100722-0.htmlSpringBoot强大的分布式锁组件Lock4j,支持多种实现

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 编程范式,建议掌握这五种!

下一篇: 电商并发减库存设计,如何做到不超卖

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top