Java实现开箱即用的redis分布式锁

 更新时间:2022年12月08日 14:51:36   作者:老马啸西风  
这篇文章主要为大家详细介绍了如何使用Java实现开箱即用的基于redis的分布式锁,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以收藏一下

项目简介

lock 为 java 设计的分布式锁,开箱即用,纵享丝滑。

开源地址:https://github.com/houbb/lock

目的

  • 开箱即用,支持注解式和过程式调用
  • 基于 redis 的分布式锁
  • 内置支持多种 redis 的整合方式
  • 渐进式设计,可独立于 spring 使用
  • 整合 spring
  • 整合 spring-boot

快速开始

需要

jdk1.7+

maven 3.x+

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>lock-core</artifactId>
    <version>1.3.0</version>
</dependency>

入门例子

基于本地 redis 的测试案例。

public void helloTest() {
    ILock lock = LockBs.newInstance();
    String key = "ddd";
    try {
        // 加锁
        lock.tryLock(key);
        System.out.println("业务处理");
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        // 释放锁
        lock.unlock(key);
    }
}

配置化

为了便于拓展,LockBs 的配置支持自定义:

LockBs.newInstance()
        .id(Ids.uuid32())   //id 生成策略
        .cache(JedisRedisServiceFactory.pooled("127.0.0.1", 6379)) //缓存策略
        .lockSupport(new RedisLockSupport())    // 锁实现策略
        .lockKeyFormat(new LockKeyFormat())     // 针对 key 的格式化处理策略
        .lockReleaseFailHandler(new LockReleaseFailHandler())   //释放锁失败处理
        ;

整合 spring

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>lock-spring</artifactId>
    <version>1.3.0</version>
</dependency>

指定 bean 使用

启用分布式锁

@EnableLock 启用分布式锁。

@EnableRedisConfig 启用 redis 的默认配置。

@Configurable
@ComponentScan(basePackages = "com.github.houbb.lock.test.service")
@EnableLock
@EnableRedisConfig
public class SpringConfig {
}

EnableLock 注解说明,和引导类对应:

public @interface EnableLock {

    /**
     * 唯一标识生成策略
     * @return 结果
     */
    String id() default "lockId";

    /**
     * 缓存实现策略 bean 名称
     *
     * 默认引入 redis-config 中的配置
     *
     * @return 实现
     */
    String cache() default "springRedisService";

    /**
     * 加锁 key 格式化策略
     * @return 策略
     */
    String lockKeyFormat() default "lockKeyFormat";

    /**
     * 锁释放失败处理类
     * @return 结果
     */
    String lockReleaseFailHandler() default "lockReleaseFailHandler";

}

其中 springRedisService 使用的是 redis-config 中的实现。

对应注解 @EnableRedisConfig,redis 的配置信息如下:

配置说明默认值
redis.addressredis 地址127.0.0.1
redis.portredis 端口6379
redis.passwordredis 密码

使用 LockBs

我们可以直接 LockBs 的引导类,这种适合一些更加灵活的场景。

@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringServiceRawTest {

    @Autowired
    private UserService userService;

    @Autowired
    private LockBs lockBs;

    @Test
    public void queryLogTest() {
        final String key = "name";
        try {
            lockBs.tryLock(key);
            final String value = userService.rawUserName(1L);
        } catch (Exception exception) {
            throw new RuntimeException(exception);
        } finally {
            lockBs.unlock(key);
        }
    }

}

aop 注解使用

指定方法注解

当然,我们可以在方法上直接指定注解 @Lock,使用更加方便。

直接使用,AOP 切面生效即可。

@Service
public class UserService {

    @Lock
    public String queryUserName(Long userId) {
    }

    @Lock(value = "#user.name")
    public void queryUserName2(User user) {
    }
}

@Lock 属性说明,value 用于指定 key,支持 SPEL 表达式。

其他属性,和引导类的方法参数一一对应。

public @interface Lock {

    /**
     * 缓存的 key 策略,支持 SpEL
     * @return 结果
     */
    String value() default "";

    /**
     * 时间单位
     * @return 单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 等待锁时间
     * @return 等待锁时间
     */
    long waitLockTime() default 10;

    /**
     * 业务加锁时间
     * @return 加锁时间
     */
    long lockTime() default 60;

}

spring boot 整合

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>lock-springboot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

使用

同 spring

后期 Road-MAP

支持锁的可重入

持有锁的线程可以多次获取锁

分布式锁注解支持

以上就是Java实现开箱即用的redis分布式锁的详细内容,更多关于Java redis分布式锁的资料请关注脚本之家其它相关文章!

相关文章

  • 浅析如何在SpringBoot中实现数据脱敏

    浅析如何在SpringBoot中实现数据脱敏

    脱敏是指在不改变原数据结构的前提下,通过某种方式处理数据,使数据不能直接暴露用户的真实信息,下面我们就来看看SpringBoot中实现数据脱敏的具体方法吧
    2024-03-03
  • Java语法糖之个数可变的形参的实现

    Java语法糖之个数可变的形参的实现

    这篇文章主要介绍了Java语法糖之个数可变的形参的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java流程控制break和continue

    Java流程控制break和continue

    这篇文章主要介绍了Java流程控制break和continue,下面文章围绕break和continue的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2021-12-12
  • Java实现堆排序和图解

    Java实现堆排序和图解

    如果将堆理解为二叉树,那么树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字,堆排序的时间复杂度为O(N*logN),这里我们就来详解堆排序算法原理及Java版的代码实现
    2021-07-07
  • Java 图解Spring启动时的后置处理器工作流程是怎样的

    Java 图解Spring启动时的后置处理器工作流程是怎样的

    spring的后置处理器有两类,bean后置处理器,bf(BeanFactory)后置处理器。bean后置处理器作用于bean的生命周期,bf的后置处理器作用于bean工厂的生命周期
    2021-10-10
  • SpringBoot使用Sa-Token实现路径拦截和特定接口放行

    SpringBoot使用Sa-Token实现路径拦截和特定接口放行

    这篇文章主要介绍了SpringBoot使用Sa-Token实现路径拦截和特定接口放行,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • Java类继承关系中的初始化顺序实例详解

    Java类继承关系中的初始化顺序实例详解

    这篇文章主要介绍了Java类继承关系中的初始化顺序,结合实例形式详细对比分析了Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧,需要的朋友可以参考下
    2019-09-09
  • Java的作业调度类库Quartz基本使用指南

    Java的作业调度类库Quartz基本使用指南

    这篇文章主要介绍了Java的作业调度类库Quartz基本使用指南,Quartz能够让类按照指定的计划顺序执行,需要的朋友可以参考下
    2016-03-03
  • Spring boot2.x中集成H2数据库代码实例

    Spring boot2.x中集成H2数据库代码实例

    这篇文章主要介绍了Spring boot2.x中集成H2数据库代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java 同步、异步、阻塞和非阻塞分析

    java 同步、异步、阻塞和非阻塞分析

    这篇文章主要介绍了java 同步、异步、阻塞和非阻塞分析的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论