黑马点评实战篇|第五篇:分布式锁-redission

目录

分布式锁-redisson功能介绍

redisson快速入门案例

分布式锁-redisson可重入锁原理

分布式锁-redission锁的MutiLock原理


分布式锁-redisson功能介绍

基于redis的setnx分布式锁会出现以下问题:

重入问题: 线程在拿到锁之后再次由该线程请求该锁 ,会成功的是重入锁 ,可以避免死锁,如synchronized ,不能成功就会陷入阻塞的是非重入锁如:setnx

不可重试: 在一次获得锁失败后不能重试请求锁,合理的分布式锁应该是可以重试请求锁
超时释放: 在设置锁时会设置过期时间,防止死锁,但在删锁的时候可能出现误删情况,虽然使用了Lua脚本,但是锁过期了,原来的业务还在执行,同时新的业务也在同时执行

**主从一致性:**集群中主从节点会同步信息,在同步信息之前主节点宕机会出现死锁

Redisson 是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

redisson快速入门案例

导入redisson,然后配置redisson

java 复制代码
<dependency>
	<groupId>org.redisson</groupId>
	<artifactId>redisson</artifactId>
	<version>3.13.6</version>
</dependency>
java 复制代码
@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create();
    }
}

如图可以修改我们之前获得锁对象的方式

trylock现在也有三种传参形式,其中可以设置重试时间在这个期间会不断重试(waittime),释放锁的时间(leaseTime)

其中无参数默认waittime为-1,也就是不重试

分布式锁-redisson可重入锁原理

打开redisson 的trylock方法的底层可通过lua脚本可知

首先检验该key是否存在不存在的时首次加载记录其值为1,往后每一次请求锁,若是该线程的都把value加1,然后重置锁有效期,注意其底层是hash结构

unlock方法底层

每一次执行到unlock方法时判断是否锁是自己的

不是则返回nil

是则把value值-1,重置锁有效期,直到为0才删除这个key完全释放锁

分布式锁-redission锁的MutiLock原理

当一个线程使用 MultiLock 时,必须成功获取到你为这个 MultiLock 指定的所有锁,才能执行后续的业务逻辑;只要有任意一把锁拿不到,整个加锁操作就会失败,线程要么重试(如果设置了等待时间),要么直接返回加锁失败,绝对不会 "只拿部分锁就执行任务"。

相关推荐
qq_2518364578 小时前
基于java Web 日化商超库存管理系统设计与实现
java·开发语言·前端
Omics Pro9 小时前
3种蛋白结构输入方式!已申报欧洲发明专利
数据库·人工智能·python·机器学习·plotly
破土士V9 小时前
【Java基础语法10】继承、多态、抽象类接口、字符串与异常等
java·开发语言
轻刀快马9 小时前
撕开 Spring 的底裤:解析 Bean 生命周期与三级缓存的“破局”之术
java·spring·缓存
KobeSacre9 小时前
JVM ZGC
java·开发语言·jvm
Chase_______9 小时前
【Java基础 | 13】IO 流(下):缓冲流、转换流、序列化与综合案例
java·开发语言
itfallrain9 小时前
Spring 构造器循环依赖排查:@RequiredArgsConstructor + @Lazy 到底有没有生效
数据库·python·spring
bush49 小时前
嵌入式linux学习记录十二,mmap
java·linux·学习
源码宝9 小时前
基于SpringCloud+UniApp的智慧工地云平台整体架构设计与实现
java·人工智能·spring cloud·源码·智慧工地·云平台
Database_Cool_9 小时前
AnalyticDB MySQL vs StarRocks/ByteHouse:云数仓选型指南——全托管 vs 自建方案
数据库·数据仓库·mysql·阿里云