【Redis 开发】Redisson

2024-04-28 11:20
文章标签 开发 redis redisson

本文主要是介绍【Redis 开发】Redisson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redisson

  • Redisson
    • Redisson分布式锁
    • Redisson可重入锁
    • Redission解决超时释放的问题
    • Redission解决锁的判断一次性问题
    • Redission分布式锁主从一致性问题

Redisson

Redisson是一个在Redis的基础上实现的java驻内存数据网格,就是提供了一系列的分布式的java对象
官方地址:https://redisson.org

Redisson分布式锁

第一步:引入依赖

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>

第二步:配置Redisson客户端:在配置文件中进行配置
这里通过配置类,完成对Redis的基本配置,在调用Redisson的创建方法根据这个配置类,创建出对应的客户端操作对象RedissonClient


@Configuration
public class RedisConfig {public RedissonClient redissonClient(){//配置类Config config=new Config();//添加redis地址,这里添加单点的地址,也可以使用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://192.168.75.135.101:6379").setPassword("520521");//创建客户端return Redisson.create(config);}
}

如何使用Redisson提供的分布式锁

    @Resourceprivate RedissonClient redissonClient;@Testvoid testRedisson() throws InterruptedException {//获取锁(可重入),指定锁的名称RLock nihao = redissonClient.getLock("nihao");//尝试获取锁,参数分别是,最大等待时间,锁自动释放时间,时间单位boolean b = nihao.tryLock(1, 10, TimeUnit.SECONDS);//判断锁释放获取成功if(b){try{System.out.println("执行业务");}finally {//释放锁nihao.unlock();}}}

Redisson可重入锁

在这里插入图片描述
原理就是在存放value的时候通过计数器机制进行重复访问,当同一个线程在此访问这个锁的时候会进行判断,是不是自己同一个线程,是的话计数器加1,同理释放锁的时候就是将该计数器的数字减1
基本流程:
在这里插入图片描述
要实现上述操作功能需要用到Lua脚本

local key = KEYS[1];-- 锁的key
local threadId = ARGV[1];-- 线程唯一标识
local releaseTime=ARGV[2];--锁的自动释放时间
-- 判断当前锁是否还是被自己持有
if(redis.call('HEXISTs",key,threadId)==0)then
return nil;--如果已经不是自己,则直接返回
end;
--是自己的锁,则重入次数-
1local count =redis.call('HINCRBY",key,threadId,-1);
--判断是否重入次数是否已经为0
if(count>0)then
--大于0说明不能释放锁,重置有效期然后返回
redis.call('EXPIRE",key, releaseTime);
return nil;
--等于0说明可以释放锁,直接删除
else
redis.call('DEL',key);
return nil;
end ;

这是可复用锁的底层原理
在Redisson的操作类中已经实现了可重复锁的相关实现,在获取锁的同时会自动进行重复锁判断

Redission解决超时释放的问题

Redisson底层通过使用Redis的watch机制和Lua脚本来实现解决超时释放锁的问题。当一个线程在获取锁时,Redisson会将锁的持有者信息保存到Redis中,并启动一个定时任务来监控锁的有效期。当锁的有效期超时时,定时任务会使用Lua脚本来检查锁是否还是当前线程持有,如果是则延长锁的有效期,如果不是则释放锁。这种机制可以确保在锁超时释放的情况下,不会出现并发访问问题。通过这种方式,Redisson能够在底层实现有效地解决超时释放的问题。

Redission解决锁的判断一次性问题

前面讲到在进行判断的时候如果没有拿到锁就会返回失败,Redis中提供了重试机制,设置一个最大等待时间,期间进行重复获取锁的操作

Redission分布式锁主从一致性问题

在当下的场景中都是多台Redis服务器进行主从服务器,假定这时有一个线程访问中Redis服务器,成功获取锁,就在这时,主服务器与从服务器同步数据的时候主服务器出现故障,这时Redis哨兵会从从服务器中选出一个来当主服务器,这是锁信息并未同步,就在这时其他线程也能够得到锁进行操作,就会出现问题

解决方案:
在Redisson中提供联锁方案,就是需要同时给多个Redis节点所送锁的信息,这时后就要判断,如果有一个失败,那么所有的节点获取锁都会失败

Rlock lock1=redissonClient.getLock("order");
Rlock lock2=redissonClient2.getLock("order");
Rlock lock3=redissonClient3.getLock("order");
//创建联锁
redissonClient.getMultiLock(lock1,lock2,lock3);

这篇关于【Redis 开发】Redisson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943124

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.