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.pswp.cn/web/80776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80776.shtml
英文地址,請注明出處:http://en.pswp.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…