Skip to content

一个注解即可搞定的分布式锁,使用超级简单

License

Notifications You must be signed in to change notification settings

boylong12/dlock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

分布式锁starter

1.一个注解即可搞定的分布式锁,使用超级简单
2.基于redis实现的非公平锁


使用步骤:

  • 第一步 引入依赖的starter(已上传maven中央仓库)
    • gradle:
    compile ("com.github.boylong12:dlock-spring-boot-starter:${dlcok.version}")
    
    • maven:
    <dependency>
        <groupId>com.github.boylong12</groupId>
        <artifactId>dlock-spring-boot-starter</artifactId>
        <version>${dlcok.version}</version>
    </dependency>
    
  • 第二步 启动dlock(两种方式任选)
    • 通过Enable注解,将@EnableDlock注解标注在启动类上
    • 通过配置文件,com.ldcr.dlock.enable=true写在配置文件中
  • 第三步 在需要使用分布式锁的业务方法上标注@Dlock注解
@Dlock(keys = "#userId", maxRetry = 1)
@Override
public String sayHello(String userId) {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return userId;
}
  • 第四步 配置redis。

使用demo dlock-demo

关机时优雅释放锁的说明

  • 开启方式(两种方式任选)
    • 通过注解,将@EnableDlock(gracefulRelease = true)注解标注在启动类上
    • 通过配置文件,com.ldcr.dlock.gracefulRelease=true写在配置文件中
  • 使用建议
    • 建议在不支持优雅关机的情况下打开
    • 在支持优雅关机的情况下慎重打开,因为有些优雅关机的实现方式会导致提前释放锁。
    • springboot从2.3.0.RELEASE开始支持优雅关机

@Dlock配置说明:

字段 类型 默认值 说明
keyPreType KeyPreTypeEnum KeyPreTypeEnum#PACKAGE 锁名称前缀类型
keyPre String "" 锁名称的自定义前缀
只有keyPreType()=KeyPreTypeEnum#CUSTOM时才有效
keys String[] "" 锁名称
默认以全类名为前缀
支持spel表达式
eg #user.id
expire long 30000 过期时间 单位:毫秒
注意:过期时间一定要大于业务的执行时间
timeout long 3000 获取锁的超时时间 单位:毫秒
根据业务确定。由于会阻塞程序执行,不宜设置过长,尤其是在高并发场景下
和maxRetry互斥,两者只会有一个生效
优先级:maxRetry大于timeout
maxRetry int 0 获取锁最大重试次数
大于0才生效
根据业务确定。由于会阻塞程序执行,不宜设置过大,尤其是在高并发场景下
和timeout互斥,两者只会有一个生效
优先级:maxRetry大于timeout

@EnableDlock配置说明:

字段 类型 默认值 说明
gracefulRelease boolean false 关机时优雅释放锁标识
建议在不支持优雅关机的情况下打开
在支持优雅关机的情况下慎重打开。因为有可能会提前释放锁
springboot从2.3.0.RELEASE开始支持优雅关机

future

  • 引入其他的实现形式,比如zk(公平锁)
  • 多种实现形式插件化,支持自主选择