Redisson全面解析:从使用方法到工作原理的深度探索

文章目录

    • 写在文章开头
    • 详解Redisson基本数据类型
      • 基础配置
      • 字符串操作
      • 列表操作
      • 映射集
      • 阻塞队列
      • 延迟队列
    • 更多关于Redisson
      • 详解Redisson 中的原子类
      • 详解redisson中的发布订阅模型
    • 小结
    • 参考

写在文章开头

Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细节,开发可以像操作普通java对象一样使用redis,而本文将针对Redisson中各种使用的数据结构和工具包使用及其实现进行详尽的分析,希望对你有帮助。

Hi,我是 sharkChili ,是个不断在硬核技术上作死的技术人,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili

同时也非常欢迎你star我的开源项目mini-redis:https://github.com/shark-ctrl/mini-redis

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

详解Redisson基本数据类型

基础配置

使用redisson的方式比较简单,我们首先需要引入redisson的依赖包:

 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version></dependency>

然后我们指明redis的ip、端口等配置即可:

spring.redis.host=localhost
spring.redis.port=6379

有了上述配置后,我们就可以快速完成redisson客户端配置:

@Configuration
public class RedissonConfig {@Autowiredprivate RedisProperties redisProperties;@Beanpublic RedissonClient redissonClient() {Config config = new Config();String redisUrl = String.format("redis://%s:%s", redisProperties.getHost() + "",redisProperties.getPort() + "");config.useSingleServer().setAddress(redisUrl);return Redisson.create(config);}}

后续在进行使用的时候,我们直接注入对应的客户端依赖即可:

@Autowiredprivate RedissonClient redissonClient;

字符串操作

和我们第一次使用redis一样,我们先用redisson完成一个字符串的键值对存储,对应的使用例子如下所示,我们只需拿到对应的test-keybucket即可进行读写操作:

 //生成 test-key 的bucketRBucket<Object> bucket = redissonClient.getBucket("test-key");//查看对应的bucket是否存在if (ObjUtil.isEmpty(bucket.get())) {//基于set指令进行插入bucket.set("test-value");//尝试通过get获取值Object value = bucket.get();log.info("value:{}", value);}

对于RBucket对象的setget操作本质上都是基于redis字符串操作指令setget的一层封装,在我们调用getBucket获取对应keybucket的时候,redisson会基于当前客户端的连接信息和bucket键进行一次封装得到一个test-keybucket对象:

在这里插入图片描述

对应的我们给出getBucket的底层实现,可以看到逻辑操作就是封装维护如下这份信息:

  1. 编码器和解码器codec,默认情况下是Kryo5Codec
  2. 执行命令的commandExecutor,该对象记录redis客户端的基本信息。
  3. name也就是我们要操作的key的信息,也就是字符串key
public RedissonObject(Codec codec, CommandAsyncExecutor commandExecutor, String name) {this.codec = codec;this.commandExecutor = commandExecutor;if (name == null) {throw new NullPointerException("name can't be null");}setName(name);}

然后就是执行set指令了,我们都知道redisson是基于Netty封装的redis操作工具,所以在进行redis操作时涉及了大量优秀的异步读写涉及,我们以上文set操作为例,实际上其底层执行时做了如下几件事:

  1. 基于传入的key,也就是我们的test-key定位到slot地址。
  2. 获取到上一步封装的编码器codec。
  3. 本次执行是set请求,所以如果我们采用主从模式进行部署,这一步是会从主库获取连接信息,因为我们就配置了一台redis,所以默认直接从默认库获取连接。
  4. 基于连接信息发送指令。
  5. 完成操作后归还连接。

这些步骤完成后,操作结果会被封装为Future对象,如果需要直到执行结果,我们调用get即可知晓处理情况:

在这里插入图片描述

对应的我们也给出set的源码入口,如笔者所说其底层就是一个set操作的异步调用setAsync,通过该回调会得到一个RFuture对象,通过get即可获取结果:

 @Overridepublic void set(V value) {//基于setAsync提交异步set操作,然后通过get获取执行结果get(setAsync(value));}

对应的我们步入setAsync可以看到它会拿着我们上一步初始化所得来的key名称、编码器、set操作指令对象以及编码后的value值通过commandExecutor进行异步写入到redis服务端:

@Overridepublic RFuture<Void> setAsync(V value) {//......//基于各种信息通过commandExecutor进行异步提交return commandExecutor.writeAsync(getRawName(), codec

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome 浏览器:互联网时代的浏览利器

Chrome 浏览器&#xff1a;互联网时代的浏览利器 引言 在互联网时代&#xff0c;浏览器已经成为我们日常生活中不可或缺的工具。作为全球最受欢迎的浏览器之一&#xff0c;Chrome 浏览器凭借其出色的性能、丰富的扩展程序和简洁的界面&#xff0c;赢得了广大用户的喜爱。本文…

网络爬虫技术如何影响网络安全的

随着网络的发展和网络爬虫技术的普及&#xff0c;一些人收集某些需要的信息&#xff0c;会使用网络爬虫进行数据抓取。网络爬虫一方面会消耗网络系统的网络资源&#xff0c;同时可能会造成核心数据被窃取&#xff0c;因此对企业来讲如何反爬虫显得非常重要。 一、什么是网络爬…

用Python进行websocket接口测试

这篇文章主要介绍了用Python进行websocket接口测试&#xff0c;帮助大家更好的理解和使用python&#xff0c;感兴趣的朋友可以了解下 我们在做接口测试时&#xff0c;除了常见的http接口&#xff0c;还有一种比较多见&#xff0c;就是socket接口&#xff0c;今天讲解下怎么用P…

SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)

目录 一、背景介绍 二、一对一查询(嵌套查询) 三、一对多查询(嵌套查询) 四、嵌套查询效率评估 注:关联查询则是指在一个查询中涉及到多个表的联合查询 一、背景介绍 当对数据库的操作涉及到多张表,这在面向对象语言如Java中就涉及到了对象与对象之间的关联关系。针对多…

xcode常见设置

1、如何使用cmake构建archs为$(ARCHS_STANDARD)的xcode项目 在cmake中使用如下指令 set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") cmake - nomadli的博客 | nomadli Blog

【RocketMQ 存储】- 同步刷盘服务 GroupCommitService

文章目录 1. 前言2. 参数3. 队列相关4. 核心逻辑 run4.1 waitForRunning4.2 doCommit4.3 flush 5. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 RocketMQ 存储部分系列文章&#xff1a; 【RocketMQ 存储】- RocketMQ存储类 MappedFile【RocketMQ 存储】- 一文总结 RocketMQ 的存…

CSS 相关知识

1、高度已知&#xff0c;三栏布局&#xff0c;左右宽度 200&#xff0c;中间自适应&#xff0c;如何实现&#xff1f; <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…

服务端与多客户端照片的传输,recv,send

一、照片传输 server.c /* * 文件名称&#xff1a;server.c * 创 建 者&#xff1a; * 创建日期&#xff1a;2025年02月07日 * 描 述&#xff1a; */ #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h…

科学上网:原理、工具、配置与注意事项

由于各种原因,我们有时无法直接访问某些境外网站或服务。这时,“科学上网”就应运而生。本文将介绍科学上网的原理、常用工具、详细配置,以及相关注意事项。 一、 什么是科学上网? 科学上网,是指通过特定技术手段绕过网络审查或地理限制,访问通常无法直接访问的互联网资…

基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具&#xff0c;旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病&#xff0c;通常表现为认知障碍、记忆丧失和语言障碍等症状…

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景&#xff1a;在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法&#xff0c;如果仅为了解决BUG不论原…

对于 useMemo 的理解及解析

在 React 中&#xff0c;useMemo 是一个 Hook&#xff0c;用于优化性能。它通过缓存计算结果来避免在每次渲染时都进行昂贵的计算。当依赖项没有变化时&#xff0c;useMemo 会返回缓存的结果&#xff0c;而不是重新计算。 主要功能 缓存计算结果&#xff1a;useMemo 可以记住…

【异常解决】在idea中提示 hutool 提示 HttpResponse used withoud try-with-resources statement

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

搜维尔科技:提供人形机器人传感器的应用案例分析

视觉传感器 • 家庭服务场景&#xff1a;在家庭清洁机器人中&#xff0c;视觉传感器可以识别家具、障碍物的位置和形状&#xff0c;规划清洁路径&#xff0c;避开桌椅、宠物玩具等。如小米扫地机器人&#xff0c;通过视觉传感器与算法结合&#xff0c;能构建房间地图&#xff…

虹科波形小课堂 | 三分钟掌握车辆相对压缩测试!不拆发动机、不测缸压就能判断故障缸!

不拆发动机、不测缸压&#xff0c;只测个电流也能知道哪个缸压缩有问题&#xff1f;没错&#xff01;做个相对压缩测试&#xff0c;测下起动电流就行&#xff0c;简单又实用&#xff01;今天&#xff0c;从原理到方法&#xff0c;几分钟教会你&#xff01; 我们都知道&#xf…

自然语言处理NLP_[1]-NLP入门

文章目录 1.自然语言处理入门1. 什么是自然语言处理2.自然语言处理的发展简史3 自然语言处理的应用场景1. **机器翻译**2. **文本分类**3. **情感分析**4. **问答系统**5. **文本生成**6. **信息抽取**7. **语音识别与合成**8. **文本摘要**9. **搜索引擎优化**10. **聊天机器人…

无限使用Cursor

原理&#xff1a;运行程序获得15天的免费试用期&#xff0c;重新运行程序重置试用期&#xff0c;实现无限使用。免费的pro账号&#xff0c;一个月有250的高级模型提问次数。 前提&#xff1a;已安装cursor cursor-vip工具&#xff1a;https://cursor.jeter.eu.org?p95d60efe…

LIMO:少即是多的推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型&#xff08;LLM&#xff09;中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据&#xff08;通常超过 100,000 个示例&#xff09;&#xff0c;但本文展…

一种基于Leaflet.Legend的图例动态更新方法

目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术已经广泛应用于各个领域&#xff0c;…

【AI时代】使用ollama私有化部署deepseek的过程及问题记录

文章目录 说明下载模型通过ollama下载通过modelscope下载 部署open-webui问题记录临时目录空间不足单机多卡部署后台启动 说明 对于DeepSeek的私有化部署&#xff0c;现在网上已经有很全面的资料了&#xff0c;本文主要记录部署以及部署过程中遇到的问题。目前对于这些问题&am…