1. 总结
1.1 加锁机制
线程去获取锁,获取成功: 执行 lua脚本,保存数据到 redis数据库。
线程去获取锁,获取失败: 一直通过 while循环尝试获取锁,获取成功后,执行 lua脚本,保存数据到 redis数据库。
1.2、watch dog自动延期机制
锁的默认时间是30s,但是看门狗机制会每隔10秒就去验证一下是否已经释放锁,否则就给锁续期
2.配置
2.1引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.10.6</version>
</dependency>
2.2 yml 配置
server:
port: 9007
servlet:
context-path: /
spring:
redis:
# 超时时间
timeout: 10000ms
# 服务器地址
host: 127.0.0.1
# 服务器端口
port: 6379
# 数据库
database: 0
# 密码
password: 123456
lettuce:
pool:
# 最大连接数,默认8
max-active: 1024
# 最大连接阻塞等待时间,默认-1
max-wait: 10000ms
# 最大空闲连接
max-idle: 200
# 最小空闲连接
min-idle: 5
3. redissonConfig
public class RedissonConfig {
@Bean(destroyMethod = "shutdown")
public RedissonClient redissonClient(RedisProperties redisProperties){
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort());
singleServerConfig.setPassword(redisProperties.getPassword());
singleServerConfig.setKeepAlive(true);
// 根据config创建出RedissonClient实例
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
4.lock 加锁
@Resource
private RedissonClient redissonClient;
public void lock() {
String begin = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
RLock lock = redissonClient.getLock("订单id");
try {
lock.lock();
//lock.lock(4, TimeUnit.SECONDS);
// 模拟业务处理
TimeUnit.SECONDS.sleep(50);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
log.info(Thread.currentThread().getName() + "---开始时间:{},, 结束时间{}", begin, end);
}
5.运行结果: