1. 介绍

介绍如何使用redisson提供分布式锁服务, 插件包装了org.redisson:redisson-spring-boot-starter 和gb-data-redis. 因为org.redisson:redisson-spring-boot-starter需要依赖spring boot,因此建议使用ea的redisson lock插件, 以保证spring boot 版本一致。

redisson的分布式锁知识参看redisson wiki

注意redisson的redlock红锁严格依赖多个redis master主机的时间一致,配置相关分布式环境时一定要同步timer服务器。

2. 使用

2.1. 使用gradle 插件

2.1.1. 添加插件

gradle中

implementation('org.yunchen.gb:gb-plugin-redisson-lock:1.2.0')

3. 配置

配置application.yml文件:

spring.redis.redisson.config: classpath:redisson.yml

在resouce目录下创建redisson.yml文件:

singleServerConfig:             (1)
  idleConnectionTimeout: 10000
  pingTimeout: 1000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  reconnectionTimeout: 3000
  failedAttempts: 3
  password: null
  subscriptionsPerConnection: 5
  clientName: null
  address:
    - redis://127.0.0.1:6379
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  connectionMinimumIdleSize: 32
  connectionPoolSize: 64
  database: 0
  dnsMonitoring: false
  dnsMonitoringInterval: 5000
1 此处演示单机模式,具体哨兵模式,集群模式的配置请自行修改。

4. 使用

4.1. 使用@Lock注解

在方法增加 @Lock 注解

//支持 spel 表达式 如果后面需要接字符串的话请用`+`连接. 字符串一定要打`单引号`
@Lock(keys = "#user.name+'OrderLock'")
public String payment(Order order) {
    ..........
}

@Lock的参数介绍

   /**
     * REENTRANT(可重入锁),FAIR(公平锁),MULTIPLE(联锁),REDLOCK(红锁),READ(读锁), WRITE(写锁),
     * AUTO(自动模式,当参数只有一个.使用 REENTRANT 参数多个 MULTIPLE)
     */
    LockModel lockModel() default LockModel.AUTO;
    /**
     * 需要锁定的keys
     * @return
     */
    String[] keys() default {};
    /**
     * 锁超时时间,默认30000毫秒(可在配置文件全局设置)
     * @return
     */
    long lockWatchdogTimeout() default 0;
    /**
     * 等待加锁超时时间,默认10000毫秒 -1 则表示一直等待(可在配置文件全局设置)
     * @return
     */
    long attemptTimeout() default 0;

4.2. 使用RedissonLockService

插件提供一个RedissonLockService实例,提供一些基本功能

  @Autowired private RedissonLockService redissonLockService

RedisService类的操作方法说明:

方法名 参数 描述

lock

String lockName,boolean isFairLock=false,long lockTimeNum=1,TimeUnit unit=TimeUnit.MINUTES

上锁资源(后三个参数有默认值可以不传)

unlock

String lockName,boolean isFairLock=false

解锁资源

getReentrantLock

String lockName

获取可重入锁

getFairLock

String lockName

获取公平锁

getReadWriteLock

String lockName

获取读取锁

getSemaphore

String semaphoreName

获取信号量

getPermitExpirableSemaphore

String semaphoreName

获取可过期性信号量

getCountDownLatch

String countDownLatchName

获取闭锁

具体的联锁(MultiLock)和红锁(RedLock)操作请参看redisson wiki

4.3. 使用RedissonClient

插件默认实例化RedissonClient提供底层操作功能,在使用时,使用@Autowaired 注入即可。

  @Autowired private RedissonClient redissonClient  (1)
1 RedissonClient类的使用请参看redisson 的javadoc