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);
  • 加锁——阻塞锁和⾮阻塞锁
//阻塞锁——不断尝试获取锁,直到获取到锁为⽌(加锁成功后,默认因线程故障超时时间为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);
  • 释放锁
lock.unlock();
  • 应用示例
//公平⾮阻塞锁
RLock lock = redissonClient.getFairLock(skuId);
boolean b = lock.tryLock(3,20,TimeUnit.SECONDS);

五、 Redisson使用实例

  • 添加依赖
<dependency>
	 <groupId>org.redisson</groupId>
	 <artifactId>redisson</artifactId>
	 <version>3.12.0</version>
</dependency>
  • application.yml(单体Redis)
redisson:
	addr:
 		singleAddr:
			host: redis://47.96.11.185:6370
 			password: 12345678
 			database: 0
  • 配置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);
		 }
}
  • 伪代码
HashMap map = null;
加锁
try{
   
	 if(isLock){
   
		 校验库存
		 if(库存充⾜){
   
			 保存订单
			 保存快照
			 修改库存
			 删除购物⻋
			 map = new HashMap
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redisson是一个基于Redis的分布式框架,它提供了可靠的分布式实现。如果使用Redisson分布式失效,可能有以下几个常见的原因: 1. 超时时间设置不合理:在使用Redisson分布式时,需要设置一个合理的超时时间。如果的超时时间设置得太短,可能会导致业务逻辑执行时间超过的超时时间,从而使其他节点在业务逻辑还未执行完毕时获取到了,造成失效。建议根据实际业务情况,合理设置的超时时间。 2. 释放不正确:在使用Redisson分布式时,需要确保在业务逻辑执行完毕后正确释放。如果业务逻辑执行过程中发生异常或错误,导致没有进行释放操作,那么其他节点将无法获取到该,从而使失效。建议使用try-finally或try-catch-finally等方式,确保在所有情况下都能够正确释放。 3. Redis连接异常或网络故障:Redisson框架内部依赖于Redis作为存储介质,如果Redis连接异常或发生网络故障,可能会导致分布式的失效。在使用Redisson分布式时,应该处理好Redis连接异常和网络故障的情况,例如进行适当的重试或错误处理。 4. Redis节点故障:如果使用的是Redis集群,当Redis集群中的某个节点发生故障或重启时,可能会导致分布式的失效。这是因为Redisson框架默认使用的是单节点模式,如果节点失效,将无法继续操作。可以使用Redisson的集群模式,通过多个Redis节点实现高可用性,并在发生故障时自动切换到其他可用节点。 在使用Redisson分布式时,建议仔细阅读其文档并按照最佳实践进行配置和使用。同时,需要注意处理异常情况和错误情况,以确保分布式的可靠性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值