Redisson是一个基于NIO的Netty框架的企业级的开源Redis Client,也提供了分布式锁的支持,Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格框架, 充分利用 Redis 键值数据库提供的一系列优势, 基于 Java 实用工具包中常用接口, 为使用者提供了 一系列具有分布式特性的常用工具类.
1、导包
<dependency>
<groupId>org.redissongroupId>
<artifactId>redisson-spring-boot-starterartifactId>
<version>3.13.6version>
dependency>
2、创建redisson配置类
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 RedissonConfig {
@Bean
public RedissonClient redissonClient(){
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
3、使用
//设置该商品的key
String productKey = "product_001";
//使用redisson获取锁
RLock lock = redissonClient.getLock(productKey);
try{
//加锁
lock.lock();
}finally {
//释放锁
lock.unlock();
}
redisson所有指令都通过lua脚本执行,redis支持lua脚本原子性执行
redisson设置一个key的默认过期时间为30s,如果某个客户端持有一个锁超过了30s怎么办?
redisson中有一个watchdog
的概念,翻译过来就是看门狗,它会在你获取锁之后,每隔10秒检查是否持有锁,如果持有则延长锁时间30s
这样的话,就算一直持有锁也不会出现key过期了,解决其他线程获取到锁的问题了。
redisson的“看门狗”逻辑保证了没有死锁发生。
注意:如果机器宕机了,看门狗也就没了。此时就不会延长key的过期时间,到了30s之后就会自动过期了,其他线程可以获取到锁
这里忽略看 //redis实现分布式锁,使用setIfAbsent方法(等同于redis中的setnx命令)
// Boolean product001 = stringRedisTemplate.opsForValue().
// setIfAbsent(productKey, productVal, 10, TimeUnit.SECONDS);