本文主要介绍redisson的分布式锁,其他功能请查看redisson的中文文档apihttps://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
首先导入redisson的依赖
<!--redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.6</version>
</dependency>
编写redisson的配置文件
我们项目中使用的是阿里云的redis ,其他配置文件都是采用redisson默认的,因为是dev环境,采用的是单机版redis,图中我圈住的地方就是单机版redisson采用的server,主从,集群版请才用其他server,设置ssl链接的格式为:redis://IP地址:端口号,有密码的话后面serpassword();
下面是redisson常用的分布式锁方法
RLock(可重入锁):
public void lock(String name) throws InterruptedException {
//获得name的锁
RLock lock = redissonClient.getLock(name);
//对name进行加锁 线程会一直等待 直到拿到该锁
lock.lock();
//尝试对name进行加锁,线程会一直等待 直到拿到该锁 然后10秒后自动解锁
lock.lock(10L,TimeUnit.SECONDS);
//对name进行解锁,如果锁不是该线程持有则会抛出异常
lock.unlock();
//强制对name进行解锁,即此锁不论是那个线程持有都会进行解锁
lock.forceUnlock();
//尝试对name进行加锁,如果该锁被其他线程持有,会等待10秒,然后返回是否成功,如果成功 会在20秒后自动解锁
boolean b = lock.tryLock(10L, 20L, TimeUnit.SECONDS);
//尝试对name进行加锁 立即返回加锁状态 如果加锁成功会在20秒后自动解锁
boolean b1 = lock.tryLock(20L, TimeUnit.SECONDS);
//检查该锁是否被任何线程所持有
boolean locked = lock.isLocked();
//检查该锁是否当前线程持有
boolean heldByCurrentThread = lock.isHeldByCurrentThread();
//当前线程对该锁的保持次数
int holdCount = lock.getHoldCount();
//该锁的剩余时间
long l = lock.remainTimeToLive();
}
以上是可重入锁的常用方法,FLock(公平锁)的使用方式跟以上一样
其他锁相关概念:
MultiLock(联锁):基于Redis的Redisson分布式联锁RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以来自于不同的Redisson实例(同时加锁,所有锁都加成功才算成功)
RedLock(红锁):基于Redis的Redisson红锁RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例。(同时加锁,大部分锁加锁成功才算成功)