目录
一、分布式锁
1、分布式锁的设计原则
2、分布式锁的实现方案
二、Redisson
三、Redisson分布式锁
1.引入Redisson依赖
2.配置Redis
3.注入RedissonClient
4.使用RLock
总结
一、分布式锁
分布式锁是分布式系统中控制共享资源访问的一种锁实现,用分布式锁控制多个进程对资源的访问。
1、分布式锁的设计原则
-
互斥性。同一时刻锁只能被一个线程持有。
-
超时释放。锁定资源的客户端崩溃时,可以避免死锁,防止不必要的线程等待和资源浪费。
-
可重入性。一个线程在持有锁的情况可以对其再次请求加锁,防止锁在线程执行完临界区操作之前释放。
-
高性能和高可用。加锁和释放锁的过程性能开销要尽可能的低,同时也要保证高可用,防止分布式锁意外失效。
-
支持阻塞和非阻塞。如果获取不到锁,不能无限期等待。
-
支持公平锁和非公平锁。
-
避免死锁和锁失效。
2、分布式锁的实现方案
- redis 实现分布式锁。
- zookeeper实现分布式锁。
- 数据库实现分布式锁。
二、Redisson
Redisson是架设在Redis基础上,通讯基于Netty的中间件,企业级开发中使用Redis的最佳范本。Redisson 对象提供了关注点分离,这使开发者可以将注意力集中在数据建模和应用程序逻辑上。
三、Redisson分布式锁
1.引入Redisson依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.17.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置Redis
spring:
redis:
database:
host:
port:
password:
3.注入RedissonClient
@Autowired
private RedissonClient redissonClient;
4.使用RLock
RLock rLock = redissonClient.getLock(orderId);
try {
boolean lockFlag = rLock.tryLock(waitTime, TimeUnit.SECONDS);
if (lockFlag) {
// TODO 业务逻辑
}
} catch (Exception e) {
log.error("处理失败", e);
}finally {
try {
rLock.unlock();
} catch (IllegalMonitorStateException e) {
log.warn("没有获取到锁,解锁失败");
}
}
总结
本文讲述了分布式锁的特征以及Redisson分布式锁的基础用法。