Redisson分布式集合原理及应用

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.mzph.cn/web/80776.shtml

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

相关文章

打破次元壁,VR 气象站开启气象学习新姿势​

在教育领域&#xff0c;VR 气象站同样发挥着巨大的作用&#xff0c;为气象教学带来了全新的模式&#xff0c;打破了传统教学的次元壁&#xff0c;让学生们以全新的姿势学习气象知识。​ 在传统的气象教学中&#xff0c;学生们主要通过课本、图片和老师的讲解来学习气象知识。这…

k8s面试题-ingress

场景&#xff1a;我通过deployment更新pod&#xff0c;ingress是怎么把新的请求流量发送到我新的pod的&#xff1f;是怎么监控到我更新的pod的&#xff1f; 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;用于管理外部访问到集群内服务的 HTTP 和 HTTPS 路…

RHCE 练习三:架设一台 NFS 服务器

一、题目要求 1、开放 /nfs/shared 目录&#xff0c;供所有用户查询资料 2、开放 /nfs/upload 目录&#xff0c;为 192.168.xxx.0/24 网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023 年 7 月,瑞士洛桑联邦理工学院的 Hongkeng Zhu 和 Elison Matioli 在《IEEE Transactions on Power Electronics》期刊发表了题为《Accurate Measurement of Dynamic ON-Resistance in GaN Transistors at Steady-State》的文章,基于提出的稳态测量方法,研究了氮化镓(…

AI 制作游戏美术素材流程分享(程序员方向粗糙版)

AI 制作游戏美术素材分享(程序员方向粗糙版) 视频讲解: 抖音:https://www.douyin.com/user/self?from_tab_namemain&modal_id7505691614690561295&showTabpost Bilibili: https://www.bilibili.com/video/BV1ojJGzZEve/ 写在最前面: 本方法比较粗糙,只对对美术风…

Java求职面试:互联网大厂技术栈深度解析

文章简述 在这篇文章中&#xff0c;我们将通过一个模拟的面试场景&#xff0c;带你深入了解Java求职面试中可能会遇到的技术栈问题。通过这个故事&#xff0c;你可以学习到相关技术点的具体应用场景和面试技巧。 正文 场景&#xff1a;某互联网大厂的面试现场 面试官&#…

学习日记-day11-5.20

完成目标&#xff1a; comment.java package com.zcr.pojo; import org.hibernate.annotations.GenericGenerator;import javax.persistence.*; //JPA操作表中数据&#xff0c;可以将对应的实体类映射到一张表上Entity(name "t_comment")//表示当前的实体类与哪张表…

机器学习第十九讲:交叉验证 → 用五次模拟考试验证真实水平

机器学习第十九讲&#xff1a;交叉验证 → 用五次模拟考试验证真实水平 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 交叉验证…

Linux面试题集合(6)

创建多级目录或者同级目录 mkdir -p 文件名/文件名/文件名 mkdir -p 文件名 文件名 文件名 Linux创建一个文件 touch 文件名 DOS命令创建文件 echo 内容>文件名&#xff08;创建一个有内容的文件&#xff09; echo >文件名&#xff08;创建一个没有内容的文件&#xff09…

Vue百日学习计划Day46-48天详细计划-Gemini版

Day 46: <KeepAlive> - 组件缓存与优化 (~3 小时) 本日目标: 理解 <KeepAlive> 的作用&#xff0c;学会如何使用它来缓存组件实例&#xff0c;从而优化应用性能和用户体验。所需资源: Vue 3 官方文档 (<KeepAlive>): https://cn.vuejs.org/guide/built-ins/…

SpringBean模块(三)具有生命周期管理能力的类(1)AutowireCapableBeanFactory

一、介绍 1、简介 AutowireCapableBeanFactory 是 Spring 框架中的一个接口&#xff0c;位于 org.springframework.beans.factory 包下&#xff0c;它提供了更底层的 Bean 实例化、依赖注入和生命周期管理能力&#xff0c;即使这些 Bean 没有通过常规的 Component 或 XML 注册…

Service Mesh

目录 一、Service Mesh 的核心特点 二、Service Mesh 的典型架构 1. Sidecar 模式 2. 控制平面与数据平面分离 三、Service Mesh 解决的核心问题 四、典型应用场景 五、主流 Service Mesh 框架对比 六、挑战与局限性 七、未来趋势 总结 Istio 一、Istio 核心组件与…

黑马Java基础笔记-13常用查找算法

查找算法 基本查找(也叫顺序查找&#xff0c;线性查找) 二分查找&#xff08;需要有序数据&#xff09; public static int binarySearch(int[] arr, int number){//1.定义两个变量记录要查找的范围int min 0;int max arr.length - 1;//2.利用循环不断的去找要查找的数据wh…

Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析

为啥挑这两个呢&#xff1f;因为两种技术分别对应CSP模型和Actor模型&#xff0c;都是经过时间检验的成熟且可靠的并发模型&#xff0c;问了很多地方&#xff0c;经过gpt整理得出如下报告。 从开发效率、运行性能、热更新扩展、云部署与水平扩展能力、多类型游戏支持等五个维度…

LeetCode 925. 长按键入 java题解

双指针。不会写。 https://leetcode.cn/problems/long-pressed-name/description/ class Solution {public boolean isLongPressedName(String name, String typed) {int len1name.length();int len2typed.length();int i0,j0;while(i<len1&&j<len2){if(name.ch…

如何使用通义灵码提高前端开发效率

工欲善其事&#xff0c;必先利其器。对于前端开发而言&#xff0c;使用VSCode已经能够极大地提高前端的开发效率了。但有了AI加持后&#xff0c;前端开发的效率又更上一层楼了&#xff01; 本文采用的AI是通义灵码插件提供的通义千问大模型&#xff0c;是目前AI性能榜第一梯队…

【小明剑魔视频Viggle AI模仿的核心算法组成】

Viggle AI 作为一款先进的生成式视频AI工具&#xff0c;其核心技术栈融合了多项前沿算法。以下是深度解析其核心算法架构及实现原理&#xff1a; 一、核心算法组成 1. 运动控制生成&#xff08;Motion Control Generation&#xff09; 算法框架&#xff1a;基于扩散模型&…

解决Power BI Desktop导入Excel数据第一行不是列标题问题

选中第一行不是列标题的表→鼠标右键→选择编辑查询→进入Power Query界面→点击“将第一行用作标题”→点击左边的“关闭并应用” 第一行就提升为标题了

对 Lambda 架构问题的深入理解

感谢 GPT&#xff0c;对很多问题的理解有机会更深。 大家攻击 Lambda 架构&#xff0c;常说的一个点就是 “实时离线指标存在差异”。“实时离线指标存在差异”&#xff0c;是一个真实困扰运营方的问题吗&#xff1f; 答案&#xff1a;是的&#xff0c;这是一个真实生活中的痛…

React中使用ahooks处理业务场景

// 从 ahooks 引入 useDynamicList 钩子函数&#xff0c;用于管理动态列表数据&#xff08;增删改&#xff09; import { useDynamicList } from ahooks;// 从 ant-design/icons 引入两个图标组件&#xff1a;减号圆圈图标和加号圆圈图标 import { MinusCircleOutlined, PlusCi…