分布式锁工具
多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。
目前提供2种分布式锁工具:
- ZooKeeper分布式锁
- Redis分布式锁
ZooKeeper分布式锁
直接使用ZookeeperLockHelper
工具,在handle
中写入锁定的业务代码
代码示例:
try {
ZookeeperLockHelper.concurrentOperation(new LockCallback() {
@Override
public Object handle() {
//业务代码
return null;
}
});
} catch (Exception e) {
}
Redis分布式锁
引入工具包
<dependency>
<groupId>com.wueasy</groupId>
<artifactId>wueasy-lock-redis</artifactId>
<version>最新版本</version>
</dependency>
redis连接配置
提供2种方式配置redis连接
方式一(使用默认spring reids)
使用默认spring redis配置,如果已经配置,可以忽略
spring:
redis:
database: 0
host: 127.0.0.1
port: 6379
password: 123456
jedis:
pool:
max-active: 15
max-idle: 15
min-idle: 0
max-wait: 10000
方式二(使用自定义)
配置结构为
wueasy.redisson
,里面的配置属性参考redisson
配置
wueasy:
redisson:
enabled: true #是否启用,一定要配置
singleServerConfig:
address: "redis://127.0.0.1:6379"
password: 123456
database: 7 #选择使用哪个数据库0~15
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
threads: 0
nettyThreads: 0
codec:
class: "org.redisson.codec.JsonJacksonCodec"
transportMode: "NIO"
代码示例
try {
RedisLockHelper.concurrentOperation(new LockCallback() {
@Override
public Object handle() {
//业务代码
return null;
}
});
} catch (Exception e) {
}
注解使用
如果我们需要锁定整个service方法,可以通过注解方式@Lock
,对应类com.wueasy.base.lock.annotation.Lock
注解提供3个属性配置
type
:类型,指定锁的实现方式,默认使用redis
分布式锁key
:资源key,锁定的资源,默认全局资源,可以使用SpEL
表达式,可以使用#p索引
获取对应索引参数timeout
:获取锁的超时时间,单位秒,默认不限时
@Lock(key = "#p0[id]")
public Result<String> test(DataMap paramMap) {
Result<String> result = new Result<>();
result.setData(StringHelper.getUuid());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.err.println(paramMap.get("id")+"--------"+LocalDateTime.now());
return result;
}
性能对比
硬件环境
测试机器采用阿里云的服务器。
应用服务器(一台)
CPU:12核,Intel Skylake Xeon Platinum 8163 2.5GHz/2.7GHz 处理器。
内存:24G
系统:CentOS 7.6 64位
压力服务器(一台)
CPU:12核,Intel Skylake Xeon Platinum 8163 2.5GHz/2.7GHz 处理器。
内存:24G
系统:Windows Server 2008 R2 企业版 64位中文版
测试结果
- ZooKeeper分布式锁TPS为
750/s
- Redis分布式锁TPS为
6000/s