分布式锁工具

多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。

目前提供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连接配置

配置结构为wueasy.redisson,里面的配置属性参考redisson配置

wueasy:
  redisson:
    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
Copyright © wueasy.com 2017-2020 all right reserved,powered by Gitbook未经允许,禁止以任何形式传播 修订时间: 2020-09-30

results matching ""

    No results matching ""