当前位置: 首页 > news >正文

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

相关文章:

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

文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…...

neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.

目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j&#xff0c;参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后&#xff0c;重新登录网页版neo4j&#xff0c;发现对应的数据库状态变…...

51单片机之引脚图(详解)

8051单片机引脚分类与功能笔记 1. 电源引脚 VCC&#xff08;第40脚&#xff09;&#xff1a;接入5V电源&#xff0c;为单片机提供工作电压。GND&#xff08;第20脚&#xff09;&#xff1a;接地端&#xff0c;确保电路的电位参考点。 2.时钟引脚 XTAL1&#xff08;第19脚&a…...

Hangfire.NET:.NET任务调度

引言&#xff1a;为何选择 Hangfire&#xff1f; 在开发.NET 应用程序时&#xff0c;我们常常会遇到这样的场景&#xff1a;应用程序需要定期发送报告&#xff0c;像财务报表&#xff0c;每日业务数据汇总报告等&#xff0c;这些报告需要定时生成并发送给相关人员&#xff1b;…...

深入解析:React 事件处理的秘密与高效实践

在 React 中&#xff0c;事件处理是构建交互式应用的核心。本文将带你深入探索 React 事件处理的机制、最佳实践以及如何避免常见陷阱&#xff0c;助你写出更高效、更健壮的代码。 1. React 事件处理的独特之处 合成事件&#xff08;SyntheticEvent&#xff09; React 使用合…...

开源像素字体,可用于独立游戏开发

方舟像素字体 / Ark Pixel Font 开源的泛中日韩像素字体&#xff0c;使用 SIL 开放字体许可证 第1.1版&#xff08;SIL Open Font License 1.1&#xff09;授权。 支持 10、12 和 16 像素尺寸。 支持语言特殊字形&#xff1a;中文-中国大陆、中文-香港特别行政区、中文-台湾…...

【论文阅读】Comment on the Security of “VOSA“

Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…...

了解传输层TCP协议

目录 一、TCP协议段格式 二、TCP原理 1.确认应答 2.超时重传 3.连接管理 建立连接 断开连接 4.滑动窗口 5.流量控制 6.拥塞控制 7.延时应答 8.捎带应答 9.面向字节流 10.TCP异常情况 TCP&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如…...

flask实现用户名查重,重复的用户名阻止注册,以及如何优化

在 Flask 中实现用户名查重&#xff0c;并阻止重复的用户名进行注册&#xff0c;可以使用数据库&#xff08;如 SQLite、MySQL、PostgreSQL&#xff09;存储用户信息&#xff0c;并在注册时检查用户名是否已存在。以下是实现步骤&#xff1a; 1. 安装 Flask 及 SQLAlchemy 确保…...

ASP.NET Core对JWT的封装

目录 JWT封装 [Authorize]的注意事项 JWT封装 NuGet 库 |Microsoft.AspNetCore.Authentication.JwtBearer 9.0.1https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearerhttps://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBea…...

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…...

Ollama部署 DeepSeek-R1:70B 模型的详细步骤

1. 确认环境准备 (1) 硬件要求 显存需求&#xff1a;70B 参数的模型需要大量显存。若使用 NVIDIA T4&#xff08;16GB 显存&#xff09;&#xff0c;需多卡并行&#xff08;如 8 卡&#xff09;或开启量化&#xff08;如 q4_0、q8_0&#xff09;。内存需求&#xff1a;建议至…...

PAT乙级( 1009 说反话 1010 一元多项式求导)C语言版本超详细解析

1009 说反话 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母&#x…...

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点&#xff08;Scheduling&#xff09;目标节点上的 Pod 创建网络配置状态上报与监控控制器管理&#xff08;Controller Manager&#xff09;就绪与服务发现 关键错误场景高级特性 流程图 具…...

Qwen2-VL:增强视觉语言模型对世界任意分辨率的感知能力

1、摘要 Qwen2-VL系列是Qwen-VL模型的高级升级版本&#xff0c;它重新定义了传统视觉处理中预设分辨率的方法。Qwen2-VL引入了Naive Dynamic Resolution机制&#xff0c;使模型能够动态处理不同分辨率的图像&#xff0c;并将其转换为不同数量的视觉标记。这种机制使模型能够生…...

原神新版本角色牌上新 七圣召唤增添新玩法

在原神这款游戏中&#xff0c;5.4版本更新后七圣召唤玩法将新增2张角色牌和对应天赋牌、3张行动牌&#xff0c;并进行部分卡牌平衡调整&#xff0c;今天就给大家介绍一下。 一、角色牌【基尼奇】 1.元素战技&#xff1a;选一个我方角色&#xff0c;自身附属钩索链接并进入夜魂…...

Spring 中的 事务 隔离级别以及传播行为

1. 事务隔离级别&#xff08;Isolation Level&#xff09; 事务隔离级别定义了事务在并发环境下的行为&#xff0c;主要解决以下问题&#xff1a; 脏读&#xff08;Dirty Read&#xff09;&#xff1a;一个事务读取了另一个未提交事务的数据。 不可重复读&#xff08;Non-Re…...

为多个GitHub账户配置SSH密钥

背景 当需要同时使用多个GitHub账户&#xff08;例如工作和个人账户&#xff09;时&#xff0c;默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对&#xff0c;并指…...

OSPF基础(3):区域划分

OSPF的区域划分 1、区域产生背景 路由器在同一个区域中泛洪LSA。为了确保每台路由器都拥有对网络拓扑的一致认知&#xff0c;LSDB需要在区域内进行同步。OSPF域如果仅有一个区域&#xff0c;随着网络规模越来越大&#xff0c;OSPF路由器的数量越来越多&#xff0c;这将导致诸…...

android studio无痛入门

在Android Studio中创建和管理项目主要涉及以下几个步骤&#xff1a; 1. 创建新项目 打开Android Studio&#xff0c;点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板&#xff0c;例如“Empty Activity”&#xff0…...

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …...

CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战

前一篇文章&#xff0c;学习率调整策略 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started CNN 卷积神经网络 CNN什么是卷积工作原理深度学习的卷积运算提取特征不同特征核的效果比较卷积核感受野共享权重池化 示例源码 …...

LeetCode 128: 最长连续序列

LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums […...

大语言模型需要的可观测性数据的关联方式

可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及&#xff0c;可观测性&#xff08;Observability&#xff09;已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态&#xff0c;还…...

【韩顺平linux】部分上课笔记整理

整理一下一些韩顺平老师上课时候的笔记 课程&#xff1a;【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境&#xff1a;使用阿里云服务器 笔记参考 &#xff1a; [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例&#xff1a; 计算两个参数的和…...

python调用pc的语音借口

先安装&#xff1a; pip install pyttsx3再运行&#xff1a; import pyttsx3 # 初始化语音引擎 def init_engine():engine pyttsx3.init()# 设置中文语音voices engine.getProperty(voices)for voice in voices:if chinese in voice.name.lower():engine.setProperty(voice…...

【Golang学习之旅】Golang 内存管理与 GC 机制详解

文章目录 前言1. Go 语言的内存管理的简述2. Golang 内存管理机制2.1 Go 语言的内存分配模型2.2 Go 变量分配示例2.3 Go 语言的内存池&#xff08;sync.Pool&#xff09; 3. Golang 垃圾回收&#xff08;GC&#xff09;机制详解3.1 Go 的 GC 机制概述3.2 GC 触发条件3.3 手动触…...

Kamailio 各个功能的共同点、不同点及应用场景

Kamailio 各个功能的共同点、不同点及应用场景&#xff1a; 功能共同点不同点应用场景SIP 注册服务器处理用户注册请求&#xff0c;维护用户位置信息专注于用户设备的注册和注销&#xff0c;维护设备位置企业内部通信系统&#xff0c;确保用户设备的动态注册和注销SIP 代理服务…...

Linux(CentOS)安装 Nginx

CentOS版本&#xff1a;CentOS 7 Nginx版本&#xff1a;1.24.0 两种安装方式&#xff1a; 一、通过 yum 安装&#xff0c;最简单&#xff0c;一键安装&#xff0c;全程无忧。 二、通过编译源码包安装&#xff0c;需具备配置相关操作。 最后附&#xff1a;设置 Nginx 服务开…...

string 与 wstring 的字符编码

测试代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include <locale.h> #include <string> #include <iostream>// 函数用于计算UTF-8字符串中的字符数 int utf8_strlen(const char* str) {int len = 0;for (; *s…...