1. 如何使用
1.1 引入依赖
<dependencies>
<!-- 以后使用Redisson作为所有分布式锁 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
1.2 配置redisson
- 可以通过配置文件配置,也可以通过配置类配置。下面讲配置类配置
- 创建配置类
@Configuration
public class MyRedissonConfig {
/**
* 所有对Redisson的使用都是通过RedissonClient
* @return
* @throws IOException
*/
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() {
//1 .创建配置,redisson包下的config类
Config config = new Config();
// 集群模式
//config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
// 单机模式
//Redis url should start with redis:// or rediss://
config.useSingleServer().setAddress("redis://10.128.240.183:6380");
//2. 根据config创建出redissonClient实例
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
1.3 测试配置是否成功
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallProductApplicationTests {
@Autowired
RedissonClient redissonClient;
// 测试是否redissonClient配置成功
@Test
public void testRedisson() {
System.out.println(redissonClient);
}
}
1.4 基于redisson实现要给分布式锁
@Controller
public class IndexController {
@Autowired
private RedissonClient redisson;
@ResponseBody
@GetMapping("/hello")
public String hello() {
//1. 获取一把锁,只要锁的名字一样,就是同一把锁
RLock myLock = redisson.getLock("my-lock");
//2. 加锁
myLock.lock(); // 阻塞式等待,默认加的锁都是30秒
try {
System.out.println("加锁成功,执行业务。。。" + Thread.currentThread().getId());
try {
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}finally {
//3. 解锁,假设解锁代码没有允许,Redisson会不会出现死锁:不会
System.out.println("释放锁。。。" + Thread.currentThread().getId());
myLock.unlock();
}
return "hello";
}
}
2. 关于Redisson的一些解释
2.1 redisson的分布式锁
- 还是基于redis的setnx指令实现
- 阻塞式等待,加锁默认加锁时间是30秒
- 锁具有自动续期(看门狗机制)的功能,如果业务超长,运行期间自动锁上新的30s。所以不用担心业务时间长,而导致锁自动过期被删掉
- 加锁的业务只要运行完成,就不会给当前锁续期了,即使不手动解锁,锁默认也会在30s内自动过期,不会产生死锁问题
- myLock.lock(10,TimeUnit.SECONDS); //10秒钟自动解锁,自动解锁时间一定要大于业务执行时间
2.2 分布式锁的自动续期
- 如果我们加锁的时候设置了释放所得时间,如myLock.lock(10,TimeUnit.SECONDS); 则不会有自动续期功能
- 如果加锁时候没有设置自动释放时间,需要手动解锁,则会有一个看门狗机制(其原理就是启动定时任务给锁重新设置过期时间:默认10s执行一次定期任务进行锁续期,续期成锁过期时间为30秒),锁默认设置30秒超时时间,当快到期且业务还没完成则会自动续期