当前位置:   article > 正文

Redisson—分布式锁框架_redisson框架

redisson框架

一、 Redisson介绍

Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的⼀系列优势,为使用者提供了⼀系列具有分布式特性的常用⼯具类。
一款基于Redis+看门狗机制的分布式锁框架

二、 Redisson工作原理

在这里插入图片描述

  • 看门狗机制
    在这里插入图片描述

三、 Redisson分布式锁特点

1、互斥性
和我们本地锁⼀样互斥性是最基本,但是分布式锁需要保证在不同节点的不同线程的互斥。
2、可重⼊性
同⼀个节点上的同⼀个线程如果获取了锁之后那么也可以再次获取这个锁。
3、锁超时
和本地锁⼀样⽀持锁超时,加锁成功之后设置超时时间,以防⽌线程故障导致不释放锁,防⽌死锁。
4、⾼效,⾼可⽤
加锁和解锁需要⾼效,同时也需要保证⾼可⽤防⽌分布式锁失效,可以增加降级。

redission是基于redis的,redis的故障就会导致redission锁的故障,因此redission⽀持单节点redis、reids主从、reids集群
5、⽀持阻塞和⾮阻塞
和 ReentrantLock ⼀样⽀持 lock 和 trylock 以及 tryLock(long timeOut)

四、 Redisson使用

  • 获取锁——公平锁和非公平锁
//获取公平锁——按照线程的先后顺序获取锁
RLock lock = redissonClient.getFairLock(skuId);
//获取⾮公平锁——多个线程随机获取锁
RLock lock = redissonClient.getLock(skuId);
  • 1
  • 2
  • 3
  • 4
  • 加锁——阻塞锁和⾮阻塞锁
//阻塞锁——不断尝试获取锁,直到获取到锁为⽌(加锁成功后,默认因线程故障超时时间为30s后释放锁;开启看⻔狗,剩5s延⻓过期时间)
lock.lock();
//阻塞锁(如果加锁成功之后,设置⾃定义20s的超时时间)
lock.lock(20,TimeUnit.SECONDS);
//⾮阻塞锁——在指定时间内不断获取锁(3秒内不断尝试获取线程加锁,默认因线程故障超时时间为30s后释放锁)
boolean b = lock.tryLock(3,TimeUnit.SECONDS);
//⾮阻塞锁(设置等待时间为3s;如果加锁成功设置⾃定义超时时间为20s)
boolean b = lock.tryLock(3,20,TimeUnit.SECONDS);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 释放锁
lock.unlock();
  • 1
  • 应用示例
//公平⾮阻塞锁
RLock lock = redissonClient.getFairLock(skuId);
boolean b = lock.tryLock(3,20,TimeUnit.SECONDS);
  • 1
  • 2
  • 3

五、 Redisson使用实例

  • 添加依赖
<dependency>
	 <groupId>org.redisson</groupId>
	 <artifactId>redisson</artifactId>
	 <version>3.12.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • application.yml(单体Redis)
redisson:
	addr:
 		singleAddr:
			host: redis://47.96.11.185:6370
 			password: 12345678
 			database: 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 配置RedissonConfig
@Configuration
public class RedissonConfig {
   

	 @Value("${redisson.addr.singleAddr.host}")
	 private String host;
	 @Value("${redisson.addr.singleAddr.password}")
	 private String password;
	 @Value("${redisson.addr.singleAddr.database}")
	 private int database;
	 
	 @Bean
	 public RedissonClient redissonClient(){
   
	 Config config = new Config();
	 
	 config.useSingleServer().setAddress(host).setPassword(password).setDatabase(database);
	 return Redisson.create(config);
		 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 伪代码
HashMap map = null;
加锁
try{
   
	 if(isLock){
   
		 校验库存
		 if(库存充⾜){
   
			 保存订单
			 保存快照
			 修改库存
			 删除购物⻋
			 map &
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/710678
推荐阅读
  

闽ICP备14008679号