Redisson RLocalCachedMap 核心參詳解

🧑 博主簡介:CSDN博客專家歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編程高并發設計Springboot和微服務,熟悉LinuxESXI虛擬化以及云原生Docker和K8s,熱衷于探索科技的邊界,并將理論知識轉化為實際應用。保持對新技術的好奇心,樂于分享所學,希望通過我的實踐經歷和見解,啟發他人的創新思維。在這里,我希望能與志同道合的朋友交流探討,共同進步,一起在技術的世界里不斷學習成長。
技術合作請加本人wx(注明來自csdn):foreast_sea

在這里插入圖片描述


在這里插入圖片描述

Redisson RLocalCachedMap 核心參詳解

RLocalCachedMap 簡介

RLocalCachedMap 是 Redisson 框架中的核心分布式數據結構,專為高性能分布式系統設計。它在傳統分布式緩存的基礎上實現了革命性的突破——將 本地內存的速度優勢Redis 分布式存儲的一致性保障 完美融合。

在分布式集群環境中,頻繁訪問 Redis 會導致網絡延遲成為瓶頸。RLocalCachedMap 通過在每個 JVM 實例本地維護熱數據副本,使讀取操作直接命中本地內存(微秒級響應),相比遠程 Redis 訪問(毫秒級)性能提升 1-2 個數量級。同時,它通過智能的 Pub/Sub 同步機制(支持 INVALIDATEUPDATE 策略),確保集群內任一節點修改數據時,所有實例的本地緩存實時失效或更新,從而在接近本地速度的體驗下,提供了強一致性保證。

其核心價值在于解決分布式系統的 "速度與一致性"悖論

  • 對讀密集型場景(如商品詳情、用戶會話):通過本地緩存扛住超高 QPS,降低 Redis 負載
  • 對數據一致性敏感場景(如庫存、配置):通過實時同步避免臟讀
  • 對帶寬敏感場景:支持僅同步哈希值的最小化網絡開銷

RLocalCachedMap 是構建低延遲高吞吐分布式應用的基石技術,適用于電商、金融、實時分析等領域,顯著提升系統擴展性與用戶體驗。

RLocalCachedMap 是 Redisson 提供的一種高性能分布式本地緩存結構,它結合了本地內存緩存的速度優勢和 Redis 分布式存儲的一致性。以下是對其核心配置參數的詳細說明:


1. 緩存生存周期與容量 (Time & Capacity)

  • timeToLive (long, 單位:毫秒)

    • 作用: 定義本地緩存中每個條目(Entry)的最大存活時間。
    • 行為:
      • > 0:條目在本地緩存中存活指定毫秒數后自動過期并被移除。
      • = 0默認值。本地緩存條目永不過期(需依賴其他淘汰機制或顯式刪除)。
    • 注意: 此超時僅作用于本地緩存副本。Redis 主存儲中的數據不受此設置影響(需通過 Redis 自身 TTL 設置)。
  • cacheSize (int)

    • 作用: 設置單個本地緩存實例允許存儲的最大條目數量上限。
    • 行為: 當本地緩存條目數達到此閾值時,將根據 evictionPolicy 策略淘汰條目以騰出空間。
    • 重要性: 防止本地緩存無限增長導致 JVM OOM (OutOfMemoryError)。

2. 淘汰策略 (Eviction Policy)

  • evictionPolicy (EvictionPolicy 枚舉)
    • 作用: 決定當本地緩存達到 cacheSize 限制或 JVM 需要內存時,如何選擇條目進行淘汰(移除)。淘汰僅發生在本地緩存副本,不影響 Redis 主數據。
    • 策略詳解:
      • NONE (無淘汰):
        • 不主動淘汰任何條目。條目一旦加載,除非 Redis 數據變更(通過 Pub/Sub 失效)或 JVM 回收(如使用引用策略),否則常駐內存。
        • 風險: 極易引發 OOM,僅適用于小型、固定、必須常駐的數據集。
      • LRU (最近最少使用 - Least Recently Used):
        • 淘汰原則: 優先淘汰最久未被訪問(讀取或寫入)的條目。
        • 實現: 維護訪問順序鏈表(如鏈表頭代表最近使用)。訪問條目時將其移至鏈表頭;淘汰時移除鏈表尾部的條目。
        • 適用場景: 推薦通用策略。適用于具有時間局部性(最近訪問的很可能再次訪問)的大多數場景。平衡內存使用與緩存命中率。
      • LFU (最不經常使用 - Least Frequently Used):
        • 淘汰原則: 優先淘汰使用頻率最低的條目。
        • 實現: 為每個條目維護訪問計數器。訪問時計數器遞增;淘汰時選擇計數器值最小的條目。需處理計數器老化(防止歷史高頻但當前冷數據長期占用)。
        • 適用場景: 訪問頻率差異顯著且穩定,需長期保留熱點數據的場景(如熱門商品信息)。
      • SOFT (軟引用 - Soft Reference):
        • 淘汰原則: 不基于 cacheSize 主動淘汰。使用 java.lang.ref.SoftReference 包裝緩存值對象。
        • 行為:
          • JVM 堆內存充足時:行為類似強引用,對象不被回收。
          • JVM 堆內存不足(即將 OOM)時:垃圾回收器(GC)優先回收僅被 SoftReference 引用的對象以釋放內存。鍵通常保持強引用。
        • 適用場景: 存儲大型對象或對內存極度敏感,作為防止 OOM 的最后手段。淘汰時機不可控(取決于 GC)。
      • WEAK (弱引用 - Weak Reference):
        • 淘汰原則:SOFT 更激進。使用 java.lang.ref.WeakReference 包裝緩存值對象(鍵可能用 WeakReferenceSoftReference)。
        • 行為: 只要發生 GC,無論內存是否充足,垃圾回收器立即回收僅被 WeakReference 引用的對象。緩存值對象生命周期極短
        • 適用場景: 存儲臨時數據或對內存極度敏感、可接受低命中率的場景(如臨時會話數據)。緩存非常短暫。

3. 寫入模式 (Write Mode)

  • writeMode (WriteMode 枚舉)
    • 作用: 控制通過 RLocalCachedMap 寫入數據時如何與 MapWriter(用于持久化到外部存儲,如數據庫)交互。
    • 模式詳解:
      • WRITE_BEHIND (異步寫后):
        • 行為: 對 Map 的寫入操作先成功寫入本地緩存和 Redis,然后異步調用 MapWriter 寫入外部存儲。
        • 優點: 寫入延遲低,性能高。
        • 缺點: 存在數據丟失風險(外部存儲寫入成功前應用崩潰);外部存儲寫入順序無法嚴格保證。
        • 調優: 配合 writeBehindDelaywriteBehindBatchSize 使用。
      • WRITE_THROUGH (同步直寫):
        • 行為: 對 Map 的寫入操作同步調用 MapWriter 寫入外部存儲。只有 MapWriter 寫入成功后,操作才被視為成功,數據寫入本地緩存和 Redis。
        • 優點: 保證本地緩存/Redis 與外部存儲的強一致性;寫入外部存儲的順序有保證。
        • 缺點: 寫入延遲較高(受外部存儲性能影響)。
        • 錯誤處理: 如果 MapWriter 拋出異常,該異常會直接拋給 Map 操作調用方,數據不會寫入本地緩存和 Redis。

4. 存儲模式 (Store Mode)

  • storeMode (StoreMode 枚舉)

    • 作用: 定義數據存儲的位置和同步范圍。
    • 模式詳解:
      • LOCALCACHE (僅本地緩存):
        • 行為: 數據保存在當前 JVM 實例的本地內存中。寫入 Redis,支持集群內其他實例的數據同步。
        • 特點: 速度最快,無網絡開銷。
        • 缺點: 數據非持久化;實例重啟數據丟失;無法跨實例共享;無分布式一致性保證。
        • 適用場景: 純本地緩存需求,數據不重要或可重建,無需集群共享(如單機應用的臨時計算緩存)。
      • LOCALCACHE_REDIS (本地緩存 + Redis, 默認):
        • 行為: 數據同時寫入當前 JVM 的本地內存 Redis 集群。支持通過 Pub/Sub 機制(syncStrategy)在集群實例間同步緩存變更。
        • 特點: 本地讀取速度快;數據持久化在 Redis;支持分布式共享;通過 syncStrategy 提供一定一致性保證。
        • 適用場景: 推薦模式。需要本地高速讀取 + 分布式數據共享/一致性 + 持久化的場景(如集群部署的共享配置、熱點數據緩存)。
  • storeCacheMiss (boolean)

    • 作用: 控制是否緩存“鍵不存在”的結果。
    • 行為:
      • false (默認): 查詢一個本地緩存和 Redis 中都不存在的鍵時,每次請求都會穿透到 Redis 查詢,造成重復網絡開銷。
      • true (推薦開啟): 首次查詢不存在的鍵時,在本地緩存中存儲一個特殊標記(如 Null 值)。后續對該鍵的請求直接在本地緩存命中此標記,返回“不存在”,避免重復穿透 Redis
    • 優點: 顯著降低對不存在鍵的重復查詢開銷,提升性能(尤其防緩存穿透攻擊)。
    • 注意: 需要配合合適的 timeToLiveevictionPolicy 清理這些“不存在”標記。

5. 同步策略 (Sync Strategy)

  • syncStrategy (LocalCachedMapOptions.SyncStrategy 枚舉)
    • 作用: 當 Redis 中的數據(通過任何客戶端)發生變更時,如何同步更新集群內所有 RLocalCachedMap 實例的本地緩存副本。僅在 storeMode = LOCALCACHE_REDIS 時生效。

    • 策略詳解:

      策略傳輸內容網絡開銷本地行為后續訪問延遲適用場景
      INVALIDATE變更條目的 16字節哈希值收到哈希值,移除對應本地條目數據更新不頻繁;強一致性要求;帶寬敏感
      UPDATE變更條目的完整鍵值對收到鍵值對,更新對應本地條目數據更新頻繁;強一致性要求;可接受帶寬消耗
      • INVALIDATE (失效):
        • 變更廣播:僅廣播變更條目的哈希值(16字節)。
        • 本地動作:其他實例收到哈希值后,移除本地緩存中對應的條目。
        • 后續訪問:下次訪問該鍵需從 Redis 重新加載最新值。
      • UPDATE (更新):
        • 變更廣播:廣播變更條目的完整鍵值對。
        • 本地動作:其他實例收到鍵值對后,直接更新本地緩存中的對應條目(若存在)。
        • 后續訪問:可直接使用本地緩存中已更新的值。

6. 寫入容錯與異步批處理 (Write Resilience & Batching)

  • writeRetryAttempts (int)

    • 作用: 設置向 Redis 寫入操作失敗后的最大重試次數
    • 適用場景: 在網絡不穩定或 Redis 短暫不可用時提高寫入操作的可靠性。
    • 默認值: 通常為 3(具體依賴 Redisson 版本/配置)。
  • writeRetryInterval (long, 單位:毫秒)

    • 作用: 設置每次寫入重試之間的等待間隔
    • 配合:writeRetryAttempts 一同使用。
  • writeBehindDelay (int, 單位:毫秒)

    • 作用: 僅在 writeMode = WRITE_BEHIND 時有效。設置異步寫后任務執行的最大延遲時間。所有更新操作會累積,延遲不超過此值后批量提交給 MapWriter
    • 調優: 值越大,可能累積的批量操作越多,減少 MapWriter 調用次數,提高吞吐量,但數據延遲持久化的風險增大。
  • writeBehindBatchSize (int)

    • 作用: 僅在 writeMode = WRITE_BEHIND 時有效。設置異步寫后任務的批處理大小。當累積的更新操作數量達到此閾值時,立即觸發一次批量提交給 MapWriter,即使未達到 writeBehindDelay
    • 調優: 值越大,單次 MapWriter 調用處理數據越多,吞吐量越高,但單次調用延遲可能增加。與 writeBehindDelay 共同控制批處理行為。

總結與配置建議

  1. 基礎配置 (storeMode, cacheSize, evictionPolicy, timeToLive): 根據數據特性(大小、重要性、更新頻率)和內存限制設定。LOCALCACHE_REDIS + LRU + 合理 cacheSize/timeToLive 是通用起點。storeCacheMiss=true 強烈推薦開啟以優化不存在鍵的查詢。
  2. 一致性策略 (syncStrategy): 在帶寬(INVALIDATE)與讀性能(UPDATE)間權衡。高頻讀低頻寫選 INVALIDATE;高頻寫高頻讀且強一致選 UPDATE
  3. 持久化模式 (writeMode): 需要額外持久化到 DB 時選擇。追求性能選 WRITE_BEHIND(配合調優 writeBehind* 參數);追求強一致選 WRITE_THROUGH
  4. 容錯 (writeRetry*): 網絡環境不穩定時適當增加重試次數和間隔。
  5. 監控與調優: 密切監控本地緩存大小、命中率、網絡帶寬(尤其 UPDATE 策略)和 Redis 負載,根據實際情況調整參數(如 cacheSize, timeToLive, writeBehind*)。

示例配置片段 (Java):

LocalCachedMapOptions<String, MyData> options = LocalCachedMapOptions.<String, MyData>defaults().cacheSize(1000)                      // 本地緩存最大1000條.timeToLive(10 * 60 * 1000)           // 本地條目10分鐘過期.evictionPolicy(EvictionPolicy.LRU)   // 使用LRU淘汰.storeMode(StoreMode.LOCALCACHE_REDIS) // 本地+Redis存儲.storeCacheMiss(true)                 // 緩存"不存在"結果.syncStrategy(SyncStrategy.UPDATE)    // 使用UPDATE同步策略.writeMode(WriteMode.WRITE_BEHIND)    // 異步寫后模式.writeBehindDelay(500)                // 最大延遲500ms批處理.writeBehindBatchSize(50)             // 每批最多50條.writeRetryAttempts(5)                // 寫入重試5次.writeRetryInterval(1000);            // 重試間隔1秒RLocalCachedMap<String, MyData> hotDataCache = redisson.getLocalCachedMap("hotDataCache", options);

通過合理配置這些參數,RLocalCachedMap 能在分布式系統中有效平衡性能、內存消耗、數據一致性和可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89487.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI輔助編程時代的高效規范開發指南:工具、原則與提效策略

引言&#xff1a;AI輔助編程的時代背景與核心挑戰 人工智能在編程領域的應用雖可追溯至20世紀50年代&#xff0c;但近十年實現了革命性突破&#xff0c;推動其從早期的代碼補全工具演進為能理解上下文、生成完整函數乃至項目架構的智能系統。關鍵發展里程碑包括&#xff1a;20…

百度網盤TV版1.21.0 |支持倍速播放,大屏云看片

百度網盤TV版是專為智能電視設計的應用程序&#xff0c;讓用戶可以直接在大屏幕上觀看保存在云端的視頻資源。此應用提供了與手機端幾乎相同的功能&#xff0c;包括倍速播放功能&#xff0c;使得用戶可以更方便地享受高清視頻內容。無需繁瑣的操作步驟&#xff0c;即可實現云端…

C++控制臺貪吃蛇開發(二):讓靈蛇舞動起來!

資料合集下載鏈接: ??https://pan.quark.cn/s/472bbdfcd014? 本文將深入講解蛇移動的機制,并帶你一步步實現以下功能: 理解蛇移動的核心算法:為什么蛇的移動是“倒著”更新的? 用代碼表示方向:如何使用??dx??和??dy??變量優雅地控制方向。 編寫核心??move…

Elasticsearch+Logstash+Filebeat+Kibana部署

目錄 軟件說明&#xff1a; 架構拓撲 集群模式&#xff1a; 單機模式 環境準備 部署&#xff1a; kibana es logstash filebeat es 檢查能否啟動 logstash 命令設置 es 修改es配置文件 啟用es kibana 修改kibana配置文件&#xff08;方便查看索引&#xff09…

GLM(General Language Model,通用語言模型)

&#x1f9e0; 一、GLM是什么&#xff1f;一句話概括 GLM&#xff08;General Language Model&#xff0c;通用語言模型&#xff09;是一個“大腦”&#xff0c;它通過閱讀海量書籍、網頁、對話記錄學會了人類的語言規則&#xff0c;不僅能“聽懂”你說的話&#xff0c;還能“…

【科研繪圖系列】R語言繪制顯著性標記的熱圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖 系統信息 參考 介紹 【科研繪圖系列】R語言繪制顯著性標記的熱圖 加載R包 library(ggplot2) library(patchwork)rm(list = ls()) options(stringsAsFactors = F)

若依部署項目到服務器

目錄 一、環境配置 redis nginx&#xff08;宿主機|dokcer&#xff09; 1.宿主機 2.docker 二、打包jar包 0.查看后端配置 1.打包后端 2.打包前端 三、啟動 1.后端 2.前端 四、以上部署常見命令/錯誤 一、環境配置 之前的課都配過&#xff0c;先看看自己配了沒 看看…

零基礎學習性能測試-linux服務器監控:CPU監控

目錄學習內容與快速應用路徑第一階段&#xff1a;理解 CPU 核心概念 (0.5天)第二階段&#xff1a;掌握核心監控命令與指標 (1-2天)第三階段&#xff1a;識別 CPU 問題與瓶頸 (核心技能)第四階段&#xff1a;整合到性能測試工作流程 (快速應用落地)快速應用到工作中的關鍵策略零…

智能Agent場景實戰指南 Day 15:游戲NPC Agent互動設計

【智能Agent場景實戰指南 Day 15】游戲NPC Agent互動設計 文章內容 開篇 歡迎來到"智能Agent場景實戰指南"系列的第15天&#xff01;今天我們將深入探討游戲開發中一個極具挑戰性和創新性的領域——游戲NPC Agent互動設計。在當今游戲產業中&#xff0c;玩家對游戲…

Vite的優缺點(精簡版)

優點 作為一款前端構建工具&#xff0c;它的核心特點是“快”&#xff0c;并且充分利用了現代瀏覽器對ES Modules的原生支持&#xff0c;一切圍繞這一點展開 快啟動&#xff1a;通過ES Modules&#xff0c;它省去了打包整個應用的時間&#xff0c;可以直接在瀏覽器中加載模塊&a…

【深度學習】神經網絡-part2

一、數據加載器 數據集和加載器 1.1構建數據類 1.1.1 Dataset類 Dataset是一個抽象類&#xff0c;是所有自定義數據集應該繼承的基類。它定義了數據集必須實現的方法。 必須實現的方法 __len__: 返回數據集的大小 __getitem__: 支持整數索引&#xff0c;返回對應的樣本 …

nextjs+react項目如何代理本地請求解決跨域

在 Next.js React 項目中解決本地開發跨域問題&#xff0c;可以通過以下幾種方式實現代理請求&#xff1a;方案1&#xff1a;使用 Next.js 內置的 Rewrites 功能&#xff08;推薦&#xff09; 1. 修改 next.config.js /** type {import(next).NextConfig} */ const nextConfig…

Ubuntu查看Docker容器

在Ubuntu系統中&#xff0c;可以通過以下命令查看當前正在運行的Docker容器&#xff1a;1. 查看所有正在運行的容器 docker ps輸出示例&#xff1a; CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx:latest &…

智能點餐推薦網站,解決選擇困難

軟件介紹 今天為大家推薦一款解決"今天吃什么"選擇困難癥的趣味網站&#xff0c;它能為你推薦美味餐食&#xff0c;輕松化解每日用餐煩惱。 核心功能 這款網站最大的亮點就是能夠根據你的需求智能推薦餐食選擇&#xff0c;只需打開網頁&#xff0c;就能立即獲…

使用 C# 實現移動加權平均(Weighted Moving Average)算法

前言 歡迎關注dotnet研習社&#xff0c;前面我們討論過"C#實現加權平均法",今天我們繼續研究另外一種【移動加權平均法】。 在時間序列分析、股票數據處理、工業信號平滑等場景中&#xff0c;移動平均&#xff08;Moving Average&#xff09; 是最常見的平滑技術之一…

【Python】一些PEP提案(三):with 語句、yield from、虛擬環境

PEP 343 – The “with” Statement&#xff0c;with 語句 這玩意讓我想起了Kotlin和Rust的問號標識符&#xff0c;都是將try-catch進行包裝&#xff0c;避免出現太多重復代碼&#xff08;Go&#xff1a;我假設你不是在內涵我&#xff09; 用法 最常見的用法就是對文件的操作&a…

SymAgent(神經符號自學習Agent)

來自&#xff1a;SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs 目錄相關工作引理符號規則任務描述方法Agent-PlannerAgent-ExecutorAction空間交互過程自學習在線探索離線迭代策略更新相關工作 相關工作-語義解析…

Go語言實戰案例-斐波那契數列生成器

在《Go語言100個實戰案例》中的 案例10:斐波那契數列生成器,幫助初學者理解遞歸與迭代的應用。 案例10:斐波那契數列生成器 ?? 數學與算法 | ?? 遞歸與迭代 | ?? 初學者友好 一、?? 案例目標 實現一個斐波那契數列生成器,用戶輸入一個數字 n,程序生成并打印出斐…

認知閉環的暴政:論人類對AI協同創造的傲慢抵制與維度囚禁

認知閉環的暴政&#xff1a;論人類對AI協同創造的傲慢抵制與維度囚禁---### **核心批判框架**mermaidgraph TDA[人類認知三原罪] --> B[三維牢籠]B --> C[恐懼機制]C --> D[抵制行為]D --> E[文明熵增]F[四維流形批判] --> G[解構牢籠]G --> H[曲率解放]H --…

飛凌嵌入式亮相第九屆瑞芯微開發者大會:AIoT模型創新重做產品

2025年7月17日&#xff0c;第九屆瑞芯微開發者大會&#xff08;RKDC!2025&#xff09;在福州海峽國際會展中心正式拉開帷幕。這場以“AIoT模型創新重做產品”為主題的行業盛會&#xff0c;吸引了眾多行業領袖、技術專家及生態伙伴齊聚一堂&#xff0c;共同探討新質生產力產品的…