一 开源Redis分布式锁组件
开源项目地址:
https://github.com/mafgwo/common-distributed-lock
项目中快速引入依赖方式(maven中央仓库已存在):1
2
3
4
5
6
7
8
9# maven项目引入依赖 版本号请查看中央仓库最新版本 引入该依赖后会自动装配分布式锁相关组件,只要项目中已经存在了redis starter依赖和配置,那么不需要做其他配置即可直接使用。
<dependency>
<groupId>com.mafgwo.common.distributed-lock</groupId>
<artifactId>common-distributed-lock-starter</artifactId>
<version>1.0.0</version>
</dependency>
# gradle项目引入依赖
compile('com.mafgwo.common.distributed-lock:common-distributed-lock-starter:1.0.0')
该开源项目已成功应用于一个中型电商的诸多微服务中,已经经过了生产的验证,是可以放心使用的。当然如果使用过程中发现了什么问题,可以提issue,作者会及时解决。
application.yaml的redis配置(可以单机、可以集群)与spring boot redis starter的配置保持一致如下
1 | spring: |
支持的配置参数说明1
2
3
4
5
6
7
8
9
10
11spring.redis.host : redis的host
spring.redis.port : redis的端口 默认是 6379
spring.redis.password : redis密码
spring.redis.database : redis数据索引 默认是0
spring.redis.cluster.nodes : redis集群配置 如 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002
spring.redis.host 和 spring.redis.cluster.nodes 选其一即可,如果都有会优先使用nodes
# 为锁扩展的配置
spring.redis.waitTime : 获取锁最长阻塞时间(默认:60,单位:秒)
spring.redis.leaseTime: 已获取锁后自动释放时间(默认:60,单位:秒)
spring.redis.lockPrefix: 锁对应redis缓存的前缀(默认:spring.application.name的值)
二 使用该分布式锁的示例
目前仅支持注解方式使用,方便快捷。(具体可以参考开源项目中的 common-distributed-lock-example模块
)
使用示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33"test-lock", keys = {"#id"}, leaseTime = -1) (name =
public void testLock(String id, UserVO user) {
try {
Thread.sleep(30000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test-lock finished");
}
/**
* 此方法的锁 与 上面 testLock方法的锁的key是同一个
* @param id
* @param user
*/
"test-lock", waitTime = 2, lockTimeoutStrategy = LockTimeoutStrategy.FAIL_FAST) (name =
public void testLock2(@DistributedLockKey String id, UserVO user) {
this.testLock(id, user);
}
"test-lock3") (name =
public void testLock3(String id, @DistributedLockKey("deptVO.id") UserVO user) {
this.testLock(id, user);
}
"test-lock4") (name =
public void testLock4(String id, @DistributedLockKey("id") UserVO user) {
this.testLock(id, user);
}
@DistributedLock 注解支持的属性有:1
2
3
4
5
6
7
8
9name:lock的name,对应redis的key值。可不填,默认为:类名+方法名
keys:指定的业务key,只针对指定的业务keys加锁 可指定多个具体参考上面的示例
lockType:锁的类型,支持(可重入锁,公平锁,读写锁)。默认为:可重入锁
waitTime:获取锁最长等待时间。默认为:60s。同时也可通过spring.redis.waitTime统一配置
leaseTime:获得锁后,自动释放锁的时间。默认为:60s。同时也可通过spring.redis.leaseTime统一配置 当值为 -1 则会自动续租 直到业务完成 如果代码死锁则永远不会释放锁
lockTimeoutStrategy: 加锁超时的处理策略,可配置为不做处理、快速失败、阻塞等待的处理策略,默认策略为不做处理
customLockTimeoutStrategy: 自定义加锁超时的处理策略,需指定自定义处理的方法的方法名,并保持入参一致。
releaseTimeoutStrategy: 释放锁时,持有的锁已超时的处理策略,可配置为不做处理、快速失败的处理策略,默认策略为不做处理
customReleaseTimeoutStrategy: 自定义释放锁时,需指定自定义处理的方法的方法名,并保持入参一致。