Redisson分布式集合原理及应用
Redisson是一个用于Redis的Java客户端,它简化了复杂的数据结构和分布式服务的使用。
适用场景对比
数据结构 | 适用场景 | 优点 |
---|---|---|
RList | 消息队列、任务队列、历史记录 | 分布式共享、阻塞操作、分页查询 |
RMap | 缓存、配置中心、键值关联数据 | 支持键值对、分布式事务、TTL |
RSet | 去重集合、唯一性校验 | 自动去重、交并差集运算 |
RQueue | 先进先出队列(FIFO) | 严格队列顺序、阻塞消费 |
RDeque | 双端队列(支持头尾操作) | 支持 addFirst /addLast 等操作 |
RMap简介
-
接口继承:RMap实现了
java.util.Map
和java.util.concurrent.ConcurrentMap
接口,这意味着它可以像普通的Java Map一样使用,并且支持并发操作。 -
功能特性:
- 支持异步、非阻塞的操作方法,例如
putAsync
,getAsync
等。 - 提供了原子性操作,如
putIfAbsent
,replace
,remove
等。 - 支持键值对的过期时间设置,可以为每个键单独设定有效时间和最长闲置时间。
- 支持本地缓存,可以在客户端缓存一些数据以减少网络请求次数。
- 具有写入策略选项,比如WRITE_BEHIND,适合在高负载情况下优化写入性能。
- 支持异步、非阻塞的操作方法,例如
使用示例
以下是使用RMap的一些基本操作示例:
创建RMap实例
RMap<String, String> map = redisson.getMap("myMap");
添加元素
map.put("key1", "value1");
异步添加元素
map.putAsync("key2", "value2").thenAccept(result -> {// Handle result here
});
获取元素
String value = map.get("key1");
设置过期时间
// 添加键值对并设置存活时间为10秒
map.put("key3", "value3", 10, TimeUnit.SECONDS);
底层实现
- 存储:RMap底层使用的数据类型是Redis的String, Redisson 会为每个 RMap 实例生成一个唯一的命名空间(如 redisson_map_{mapName}:{key}),并将每个键值对作为独立的 Redis Key 存储。
- 分布式:由于Redis本身是分布式的,RMap自然也具备分布式的特点,可以跨多个节点进行扩展。
- 事务与锁:Redisson提供了对RMap操作的事务支持以及分布式锁机制,保证了在并发环境下数据的一致性和完整性。
RList 简介
Redisson 的 RList
是一个基于 Redis 的分布式列表(List)实现,它封装了 Redis 的 List 数据结构,并提供了与 Java 标准 java.util.List
接口兼容的 API。RList
支持在分布式环境中高效地操作列表数据,适用于需要共享、并发访问和跨节点同步的场景。
核心特性
-
分布式共享:
RList
的数据存储在 Redis 服务器中,多个客户端可以跨节点共享和修改同一个列表,实现分布式数据一致性。 -
线程安全:
所有对RList
的操作都是线程安全的,Redisson 通过 Redis 的原子操作(如LPUSH
、RPUSH
、LPOP
等)保证并发下的数据一致性。 -
支持阻塞操作:
提供blocking
和blockingDeque
操作(如takeFirst()
、takeLast()
),在列表为空时阻塞直到有元素可用,适合实现生产者-消费者模式。 -
分页和范围操作:
支持通过索引范围(subList()
)或分页(getRange()
)高效读取部分数据,适用于大数据量场景。 -
自动序列化:
Redisson 提供了默认的序列化机制(如 JSON、Kryo),开发者无需手动处理键值的序列化与反序列化。 -
高可用与扩展性:
借助 Redis 的主从复制、集群分片和哨兵机制,RList
可以实现高可用性和水平扩展。
底层实现原理
-
Redis List 数据结构:
RList
底层基于 Redis 的 List 类型,其内部实现是双向链表(3.2 版本前为ziplist
或linkedlist
,3.2 后为quicklist
)。- LPUSH/RPUSH:在列表头部/尾部插入元素。
- LPOP/RPOP:从列表头部/尾部弹出元素。
- LRANGE:获取指定范围内的元素。
-
Redisson 封装:
Redisson 通过发送标准 Redis 命令操作 List,并在客户端缓存部分数据(可配置),减少网络往返次数。
使用场景
-
消息队列
- 通过
RList
实现分布式消息队列,使用RPush
(生产者)和LPop
(消费者)操作。 - 支持阻塞操作(
BLPop
/BRPop
),避免轮询开销。
- 通过
-
任务队列
- 存储待处理任务,多个工作节点并发消费任务(如定时任务、异步处理)。
-
历史记录
- 记录用户操作日志、浏览记录等,通过
RPush
添加新记录,LRANGE
查询历史。
- 记录用户操作日志、浏览记录等,通过
-
排行榜/最新动态
- 结合
RList
和RMap
实现动态更新的排行榜(如热门文章、最新评论)。
- 结合
-
分页查询
- 预先将数据填充到
RList
,通过LRANGE
分页读取数据(如社交平台的消息流)。
- 预先将数据填充到
-
缓存预热
- 在分布式系统中共享预热数据(如热点商品 ID 列表)。
示例代码
// 初始化 Redisson 客户端
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);// 获取 RList 实例
RList<String> list = redisson.getList("myList");// 添加元素
list.add("item1");
list.addFirst("item0"); // 插入到头部
list.addLast("item2"); // 插入到尾部// 获取元素
String firstItem = list.get(0); // 通过索引访问
String removedItem = list.remove(0); // 移除并返回索引处元素// 阻塞操作(等待元素可用)
String item = list.takeFirst(); // 阻塞直到有元素可取// 分页查询
List<String> subList = list.subList(0, 10); // 获取前10个元素// 关闭客户端
redisson.shutdown();
性能与注意事项
-
性能特点:
- 头尾操作高效:
addFirst()
、addLast()
、removeFirst()
、removeLast()
时间复杂度为 O(1)。 - 中间索引访问低效:
get(index)
或set(index, value)
需遍历链表,时间复杂度为 O(N)。 - 大数据量分页:使用
subList()
或LRANGE
可避免一次性加载全部数据。
- 头尾操作高效:
-
网络开销:
所有操作需通过网络与 Redis 交互,相比本地 Java List 会有额外延迟。建议仅在需要分布式共享的场景中使用。 -
内存管理:
Redis 是内存数据库,需监控RList
的大小,避免内存溢出。可通过trim()
方法限制列表长度。 -
持久化与故障转移:
- 依赖 Redis 的持久化(RDB/AOF)保障数据可靠性。
- 使用 Redis Sentinel 或 Cluster 时,
RList
会自动处理故障转移。
与 Redis 原生命令的映射
Redisson 方法 | Redis 命令 | 说明 |
---|---|---|
add(value) | RPUSH key value | 向列表尾部添加元素 |
addFirst() | LPUSH key value | 向列表头部添加元素 |
remove() | LPOP key | 移除并返回列表头部元素 |
removeLast() | RPOP key | 移除并返回列表尾部元素 |
get(index) | LINDEX key index | 获取指定索引的元素 |
subList(start, end) | LRANGE key start end | 获取指定范围的元素 |
相关文章:
Redisson分布式集合原理及应用
Redisson是一个用于Redis的Java客户端,它简化了复杂的数据结构和分布式服务的使用。 适用场景对比 数据结构适用场景优点RList消息队列、任务队列、历史记录分布式共享、阻塞操作、分页查询RMap缓存、配置中心、键值关联数据支持键值对、分布式事务、TTLRSet去重集…...

深入理解 PlaNet(Deep Planning Network):基于python从零实现
引言:基于模型的强化学习与潜在动态 基于模型的强化学习(Model-based Reinforcement Learning)旨在通过学习环境动态的模型来提高样本效率。这个模型可以用来进行规划,让智能体在不需要与真实环境进行每一次决策交互的情况下&…...
精益数据分析(75/126):用户反馈的科学解读与试验驱动迭代——Rally的双向验证方法论
精益数据分析(75/126):用户反馈的科学解读与试验驱动迭代——Rally的双向验证方法论 在创业的黏性阶段,用户反馈是优化产品的重要依据,但如何避免被表面反馈误导?如何将反馈转化为可落地的迭代策略&#x…...

仿腾讯会议——视频发送接收
1、 添加音频模块 2、刷新图片,触发重绘 3、 等比例缩放视频帧 4、 新建视频对象 5、在中介者内定义发送视频帧的函数 6、完成发送视频的函数 7、 完成开启/关闭视频 8、绑定视频的信号槽函数 9、 完成开启/关闭视频 10、 完成发送视频 11、 完成刷新图片显示 12、完…...

从3.7V/5V到7.4V,FP6291在应急供电智能门锁中的应用
在智能家居蓬勃发展的当下,智能门锁以其便捷、安全的特性,成为现代家庭安防的重要组成部分。在智能门锁电量耗尽的情况下,应急电源外接移动电源(USB5V输入) FP6291升压到7.4V供电可应急开锁。增强用户在锁具的安全性、…...
java后端-海外登录(谷歌/FaceBook)
前言 由于最近公司的项目要在海外运行,因此需要对接海外的登录,目前就是谷歌和facebook两种,后面支付也是需要的,后续再进行书写 谷歌登录 这个相对比较容易,而且只提供给安卓即可,废话就不多说了,直接贴解决方案 引入maven依赖 <dependency> <groupId>com.go…...

【人工智障生成日记1】从零开始训练本地小语言模型
🎯 从零开始训练本地小语言模型:MiniGPT TinyStories(4090Ti) 🧭 项目背景 本项目旨在以学习为目的,从头构建一个完整的本地语言模型训练管线。目标是: ✅ 不依赖外部云计算✅ 完全本地运行…...

Selenium-Java版(frame切换/窗口切换)
frame切换/窗口切换 前言 切换到frame 原因 解决 切换回原来的主html 切换到新的窗口 问题 解决 回到原窗口 法一 法二 示例 前言 参考教程:Python Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili 上期文章:Sel…...

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异
在 Solana 链上,Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型,到后续的自动迁移与交易市场,Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…...

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态
星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态 2024年5月15日,成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…...

SpringBoot(一)--- Maven基础
目录 前言 一、初始Maven 1.依赖管理 2.项目构建 3.统一项目结构 二、IDEA集成Maven 1.Maven安装 2.创建Maven项目 2.1全局设置 2.2 创建SpringBoot项目 2.3 常见问题 三、单元测试 1.JUnit入门 2.断言 前言 Maven 是一款用于管理和构建Java项目的工具ÿ…...

基于FPGA控制电容阵列与最小反射算法的差分探头优化设计
在现代高速数字系统测试中,差分探头的信号完整性直接影响测量精度。传统探头存在阻抗失配导致的信号反射问题,本文提出一种通过FPGA动态控制电容阵列,结合最小反射算法的优化方案,可实时调整探头等效容抗,将信号反射损…...

kakfa 基本了解
部署结构 Kafka 使用zookeeper来协商和同步,但是kafka 从版本3.5正式开始deprecate zookeeper, 同时推荐使用自带的 kraft. 而从4.0 开始则不再支持 zookeeper。 所以 kafka 是有control plane 和 data plane 的。 data plane 就是broker,control plane…...
基于Browser Use + Playwright 实现AI Agent操作Web UI自动化
Browser Use是什么 Browser Use是一个开源项目官网:Browser Use - Enable AI to control your browser,专为大语言模型(LLM)设计的只能浏览器工具,能够让AI像人类一样自然的浏览和操作网页,支持多标签页管…...

Origin绘制多因子柱状点线图
多因子柱状点线图是一种结合柱状图和点线图的复合图表,常用于同时展示多个因子(变量)在不同分组下的分布和趋势变化。 适用场景: (1)比较多个因子在不同分组中的数值大小(柱状图)&a…...

Web漏洞扫描服务的特点与优势:守护数字时代的安全防线
在数字化浪潮中,Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级,Web漏洞扫描服务作为一种主动防御工具,逐渐成为企业安全体系的标配。本文将从特点与优势两方面,解析其价值与应用场景…...
iOS 直播技术及优化
iOS直播技术的实现和优化涉及多个技术环节,需结合协议选择、编解码方案、播放器技术及性能调优等多方面。 一、核心技术实现 协议选择与传输优化 HLS(HTTP Live Streaming):苹果官方推荐,基于HTTP分片传输,…...

抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案
一、方案背景 随着网络通信发展,实时音视频需求激增。传统服务器中转方式延迟高、资源消耗大,WebP2P技术由此兴起。EasyRTC作为高性能实时通信平台,集成WebP2P技术,实现低延迟、高效率音视频通信,广泛应用于教育、医疗…...

俄罗斯军总参情报局APT28组织瞄准援乌后勤供应链发起全球网络攻击
2025年5月,由美国、英国、欧盟和北约网络安全与情报机构联合发布的最新网络安全公告披露,俄罗斯军总参情报局(GRU)第85特别服务中心第26165部队(又称APT28、Fancy Bear、Forest Blizzard和BlueDelta)正持续…...

杰发科技AC7801——PWM获取固定脉冲个数
测试通道6 在初始化时候打开通道中断 void PWM1_GenerateFrequency(void) {PWM_CombineChConfig combineChConfig[1]; //组合模式相关结构体PWM_IndependentChConfig independentChConfig[2];//独立模式相关结构体PWM_ModulationConfigType pwmConfig; //PWM模式相关结构体PWM…...

MacBookPro上macOS安装第三方应用报错解决方案:遇到:“无法打开“XXX”,因为无法确定(验证)开发者身份?怎么解决
MacBook Pro 上 macOS 安装第三方应用报错解决方案 —— 彻底搞定「无法打开“XXX”,因为无法确定开发者身份」 适用系统:macOS Catalina 10.15 ~ macOS Sonoma 14.x 适用机型:Intel / Apple Silicon 全系 MacBook Pro 文章目录 **MacBook P…...
MVC和MVVM架构的区别
MVC和MVVM都是前端开发中常用的设计模式,都是为了解决前端开发中的复杂性而设计的,而MVVM模式则是一种基于MVC模式的新模式。 MVC(Model-View-Controller)的三个核心部分:模型、视图、控制器相较于MVVM(Model-View-ViewModel)的三个核心部分…...

RAG(Retrieval-Augmented-Generation)检索增强生成
什么是RAG(检索增强生成)? RAG是一种AI框架,结合传统的数据检索技术和LLM(大语言模型)的优势,通过将外部数据和LLM生成语言技能集合,对LLM的输出进行优化,使输出更准确、…...

黑马点评前端Nginx启动失败问题解决记录
Nginx启动失败问题解决记录 问题描述 在学习黑马Redis课程时,启动黑马点评Nginx前端项目发现: 无法访问8080端口检查Windows端口占用情况(无占用)结论:Nginx服务未成功启动 错误日志分析 在nginx安装目录下的logs…...

第12天-Python+Qt5开发实战:10大经典案例与深度解析
1. 基础窗口与信号槽机制 python 复制 下载 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("信号槽示例")btn = QPushButton("…...
软件开发命名避开保留关键字指南
在软件开发中,命名时避开保留关键字至关重要,否则可能导致语法错误、逻辑混乱或兼容性问题。以下是需要注意事项及具体建议: 1. 识别保留关键字 数据库系统:不同数据库的保留关键字不同,需查阅官方文档。 MySQL&#x…...
力扣第450场周赛
Q1. 数位和等于下标的最小下标 给你一个整数数组 nums 。 返回满足 nums[i] 的数位和(每一位数字相加求和)等于 i 的 最小 下标 i 。 如果不存在满足要求的下标,返回 -1 。 示例 1: 输入:nums [1,3,2] 输出࿱…...
React-改变当前页class默认的样式
比如antd for mobile,已经定义了默认的ui的class样式,如果想在当前页面的控件显示特殊的样式,除了指定style外,还可以强制改变默认class的样式,比如我想改变list.item的字体。 在返回渲染布局里面加上 return (<&…...
zabbix 常见问题
一、zabbix主动模式和被动模式可以同时使用吗? Zabbix 的主动模式(Active Mode)和被动模式(Passive Mode)可以同时启用并共存,但需要满足以下条件: 1、agent配置 在 Zabbix Agent 的配置文件…...

人工智能培训:解锁未来职场竞争力的核心路径与课程内容解析
当AI绘画工具在几秒内生成一幅媲美专业画师的作品,当AI程序员自主优化代码逻辑,当AI客服精准解答复杂问题——一个现实愈发清晰:人工智能正在重新定义“专业能力”的边界。 对于普通人而言,这场变革既带来焦虑,也孕育机…...