基于Redis的分布式锁优化

Redission介绍
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的ava常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

Redission入门
1、引入依赖
java
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-23</artifactId>
<version>3.13.6</version>
</dependency>
2、配置Redsssion客户端
java
package com.hmdp.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisConfig {
@Bean
public RedissonClient redissonClient() {
// 1. 创建 Config 对象
Config config = new Config();
// 2. 添加单点地址,注意:地址必须以 "redis://" 开头
//也可使用config.useClusterServers()添加集群地址
config.useSingleServer()
.setAddress("redis://192.168.150.101:6379")
.setPassword("123321");
// 3. 创建 Redisson 实例并返回
return Redisson.create(config);
}
}
3、使用Redission的分布式锁
java
@Resource
private RedissonClient redissonClient;
@Test
void testRedisson() throws InterruptedException {
// 1. 获取锁(可重入),指定锁的名称
RLock lock = redissonClient.getLock("anyLock");
/**
* 2. 尝试获取锁
* 参数1:获取锁的最大等待时间(期间会重试)
* 参数2:锁自动释放时间(到期自动解锁)
* 参数3:时间单位
*/
boolean isLock = lock.tryLock(1, 10, TimeUnit.SECONDS);
// 3. 判断释放获取成功
if (isLock) {
try {
System.out.println("执行业务");
} finally {
// 4. 释放锁
// 建议增加判断:只有锁还在且是当前线程持有的才释放,防止误释放或报错
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}
Redission可重入锁原理



Redission锁重试和看门狗(WatchDog)机制


Redission的multLock原理
Redission分布式锁主从一致性问题

