Redisson分布式集合原理及应用

news2025/5/23 10:00:01

Redisson是一个用于Redis的Java客户端,它简化了复杂的数据结构和分布式服务的使用。

适用场景对比

数据结构适用场景优点
RList消息队列、任务队列、历史记录分布式共享、阻塞操作、分页查询
RMap缓存、配置中心、键值关联数据支持键值对、分布式事务、TTL
RSet去重集合、唯一性校验自动去重、交并差集运算
RQueue先进先出队列(FIFO)严格队列顺序、阻塞消费
RDeque双端队列(支持头尾操作)支持 addFirst/addLast 等操作

RMap简介

  • 接口继承:RMap实现了java.util.Mapjava.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 的原子操作(如 LPUSHRPUSHLPOP 等)保证并发下的数据一致性。

  • 支持阻塞操作
    提供 blockingblockingDeque 操作(如 takeFirst()takeLast()),在列表为空时阻塞直到有元素可用,适合实现生产者-消费者模式。

  • 分页和范围操作
    支持通过索引范围(subList())或分页(getRange())高效读取部分数据,适用于大数据量场景。

  • 自动序列化
    Redisson 提供了默认的序列化机制(如 JSON、Kryo),开发者无需手动处理键值的序列化与反序列化。

  • 高可用与扩展性
    借助 Redis 的主从复制、集群分片和哨兵机制,RList 可以实现高可用性和水平扩展。


底层实现原理
  • Redis List 数据结构
    RList 底层基于 Redis 的 List 类型,其内部实现是双向链表(3.2 版本前为 ziplistlinkedlist,3.2 后为 quicklist)。

    • LPUSH/RPUSH:在列表头部/尾部插入元素。
    • LPOP/RPOP:从列表头部/尾部弹出元素。
    • LRANGE:获取指定范围内的元素。
  • Redisson 封装
    Redisson 通过发送标准 Redis 命令操作 List,并在客户端缓存部分数据(可配置),减少网络往返次数。


使用场景
  1. 消息队列

    • 通过 RList 实现分布式消息队列,使用 RPush(生产者)和 LPop(消费者)操作。
    • 支持阻塞操作(BLPop/BRPop),避免轮询开销。
  2. 任务队列

    • 存储待处理任务,多个工作节点并发消费任务(如定时任务、异步处理)。
  3. 历史记录

    • 记录用户操作日志、浏览记录等,通过 RPush 添加新记录,LRANGE 查询历史。
  4. 排行榜/最新动态

    • 结合 RListRMap 实现动态更新的排行榜(如热门文章、最新评论)。
  5. 分页查询

    • 预先将数据填充到 RList,通过 LRANGE 分页读取数据(如社交平台的消息流)。
  6. 缓存预热

    • 在分布式系统中共享预热数据(如热点商品 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获取指定范围的元素

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

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

相关文章

深入理解 PlaNet(Deep Planning Network):基于python从零实现

引言&#xff1a;基于模型的强化学习与潜在动态 基于模型的强化学习&#xff08;Model-based Reinforcement Learning&#xff09;旨在通过学习环境动态的模型来提高样本效率。这个模型可以用来进行规划&#xff0c;让智能体在不需要与真实环境进行每一次决策交互的情况下&…

仿腾讯会议——视频发送接收

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

从3.7V/5V到7.4V,FP6291在应急供电智能门锁中的应用

在智能家居蓬勃发展的当下&#xff0c;智能门锁以其便捷、安全的特性&#xff0c;成为现代家庭安防的重要组成部分。在智能门锁电量耗尽的情况下&#xff0c;应急电源外接移动电源&#xff08;USB5V输入&#xff09; FP6291升压到7.4V供电可应急开锁。增强用户在锁具的安全性、…

【人工智障生成日记1】从零开始训练本地小语言模型

&#x1f3af; 从零开始训练本地小语言模型&#xff1a;MiniGPT TinyStories&#xff08;4090Ti&#xff09; &#x1f9ed; 项目背景 本项目旨在以学习为目的&#xff0c;从头构建一个完整的本地语言模型训练管线。目标是&#xff1a; ✅ 不依赖外部云计算✅ 完全本地运行…

Selenium-Java版(frame切换/窗口切换)

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

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异

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

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态

星云智控v1.0.0产品发布会圆满举行&#xff1a;以创新技术重构物联网监控新生态 2024年5月15日&#xff0c;成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控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项目的工具&#xff…

基于FPGA控制电容阵列与最小反射算法的差分探头优化设计

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

kakfa 基本了解

部署结构 Kafka 使用zookeeper来协商和同步&#xff0c;但是kafka 从版本3.5正式开始deprecate zookeeper, 同时推荐使用自带的 kraft. 而从4.0 开始则不再支持 zookeeper。 所以 kafka 是有control plane 和 data plane 的。 data plane 就是broker&#xff0c;control plane…

Origin绘制多因子柱状点线图

多因子柱状点线图是一种结合柱状图和点线图的复合图表&#xff0c;常用于同时展示多个因子&#xff08;变量&#xff09;在不同分组下的分布和趋势变化。 适用场景&#xff1a; &#xff08;1&#xff09;比较多个因子在不同分组中的数值大小&#xff08;柱状图&#xff09;&a…

Web漏洞扫描服务的特点与优势:守护数字时代的安全防线

在数字化浪潮中&#xff0c;Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级&#xff0c;Web漏洞扫描服务作为一种主动防御工具&#xff0c;逐渐成为企业安全体系的标配。本文将从特点与优势两方面&#xff0c;解析其价值与应用场景…

抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案

一、方案背景 随着网络通信发展&#xff0c;实时音视频需求激增。传统服务器中转方式延迟高、资源消耗大&#xff0c;WebP2P技术由此兴起。EasyRTC作为高性能实时通信平台&#xff0c;集成WebP2P技术&#xff0c;实现低延迟、高效率音视频通信&#xff0c;广泛应用于教育、医疗…

俄罗斯军总参情报局APT28组织瞄准援乌后勤供应链发起全球网络攻击

2025年5月&#xff0c;由美国、英国、欧盟和北约网络安全与情报机构联合发布的最新网络安全公告披露&#xff0c;俄罗斯军总参情报局&#xff08;GRU&#xff09;第85特别服务中心第26165部队&#xff08;又称APT28、Fancy Bear、Forest Blizzard和BlueDelta&#xff09;正持续…

杰发科技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”&#xff0c;因为无法确定开发者身份」 适用系统&#xff1a;macOS Catalina 10.15 ~ macOS Sonoma 14.x 适用机型&#xff1a;Intel / Apple Silicon 全系 MacBook Pro 文章目录 **MacBook P…

RAG(Retrieval-Augmented-Generation)检索增强生成

什么是RAG&#xff08;检索增强生成&#xff09;&#xff1f; RAG是一种AI框架&#xff0c;结合传统的数据检索技术和LLM&#xff08;大语言模型&#xff09;的优势&#xff0c;通过将外部数据和LLM生成语言技能集合&#xff0c;对LLM的输出进行优化&#xff0c;使输出更准确、…

黑马点评前端Nginx启动失败问题解决记录

Nginx启动失败问题解决记录 问题描述 在学习黑马Redis课程时&#xff0c;启动黑马点评Nginx前端项目发现&#xff1a; 无法访问8080端口检查Windows端口占用情况&#xff08;无占用&#xff09;结论&#xff1a;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("…

人工智能培训:解锁未来职场竞争力的核心路径与课程内容解析

当AI绘画工具在几秒内生成一幅媲美专业画师的作品&#xff0c;当AI程序员自主优化代码逻辑&#xff0c;当AI客服精准解答复杂问题——一个现实愈发清晰&#xff1a;人工智能正在重新定义“专业能力”的边界。 对于普通人而言&#xff0c;这场变革既带来焦虑&#xff0c;也孕育机…