目录
一、Redisson的使用
1.Redisson
Redisson是一个在Redis的基础上实现的Java驻内存管理网络(In-Memory Data Gird), 它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包括了各种分布式的实现。
8.分布式锁(Lock)和同步器(Synchronizer)
8.1.可重入锁(Reentrant Lock)
8.2.公平锁(Fair Lock)08.3.联锁(MultiLock)
8.4.红锁(RedLock)
8.5.读写锁(ReadWriteLock)8.6.信号量(Semaphore)
8.7.可过期性信号量(PermitExpirableSemaphore)8.8.闭锁(CountDownLatch)
官网地址:Redisson: Redis Java client with features of In-Memory Data Grid
2.导入依赖
这里我们使用maven管理依赖,先导入依赖
<!--redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>
3.建立Redssion配置类
public class RedissonConfig {
public RedissonClient createRedisson() {
//配置
Config config = new Config();
//useSingleServer指的是单例模式,设置redis地址,端口号,密码
config.useSingleServer().setAddress("redis://192.68.23.100:6379").setPassword("zjy123...000");
//创建RedissonClient对象
return Redisson.create(config);
}
}
4.使用
//使用
@Resource
private RedissonClient redissonClient;
//例子:
RLock lock = redissonClient.getLock("lock");
//获取锁
boolean isLock = lock.tryLock();
//执行业务
//释放锁
lock.unlock("lock");
二、redisson的可重入锁
1.基本原理
利用redis的hash结构存储锁,key值随意,field属性为线程标识,value为锁次数。当线程获取一次锁后,如果此时redis中没有这个锁,则创建并将锁次数置为1;接下来如果线程再次获取锁会进行一次判断。即对比线程标识是否是同一个线程的多次获取,如果是的话锁次数+1。同样的,如果是释放锁的话也需要对线程标识进行判断,然后让对应的锁次数-1,当锁的次数为0时,表示此时可以删除锁了。
2.test
@SpringBootTest
class RedissonTest {
@Resource
private RedissonClient redissonClient;
private RLock lock;
@BeforeEach
void setup() {
//对锁进行初始化
lock = redissonClient.getLock("lock");
}
// 方法A
@Test
void A() {
//尝试获取锁
boolean isLock = lock.tryLock();
if(!isLock) {
System.out.println("获取锁失败。。。1");
return;
}
try {
System.out.println("获取锁成功。。。1");
// 获取锁后调用方法B
B();
System.out.println("开始执行业务。。。1");
} finally {
System.out.println("准备释放锁。。。1");
lock.unlock();
}
}
void B() {
//尝试获取锁
boolean isLock = lock.tryLock();
if(!isLock) {
System.out.println("获取锁失败。。。2");
return;
}
try {
System.out.println("获取锁成功。。。2");
System.out.println("开始执行业务。。。2");
} finally {
System.out.println("准备释放锁。。。2");
lock.unlock();
}
}
}
//运行结果
/*
获取锁成功。。。1
获取锁成功。。。2
开始执行业务。。。2
准备释放锁。。。2
开始执行业务。。。1
准备释放锁。。。1
*/
由于执行完成后锁已经被删除,redis内无法看到,所以我们打断点查看一下:
断点1:
断点2:
可以看到此时锁次数变为2。
断点3:
此时方法B执行完,释放了一次锁,锁的次数变为1。