springboot操作redis集群,注意事項

整合redis可查看博文
springboot 整合redis_springboot整合redis csdn-CSDN博客

集群中操作注意事項

1 多鍵操作失敗
當使用multiGet等需要同時訪問多個鍵的方法時,如果沒有使用Hash Tags,這些鍵可能會被分配到不同的槽中。如果這些槽位于不同的Redis節點上,那么multiGet將無法正確返回所有鍵的值。

2 Pipeline操作受限
在Redis集群中,pipeline操作不能跨越多個槽進行。如果通過pipeline發送的命令涉及多個不同的槽(即鍵被分配到了不同的節點),則可能會導致部分命令失敗或者整個pipeline操作效率降低。

3 事務支持有限
Redis集群不支持原生的MULTI/EXEC事務模型,特別是當事務涉及多個不同的槽時。因此,嘗試在集群模式下使用事務來管理多個鍵的操作可能會失敗。


代碼示例
1 application.yml

spring:application:name: zha7zha8data:redis:cluster:nodes:- 192.168.1.100:6381- 192.168.1.100:6382- 192.168.1.100:6383- 192.168.1.100:6384- 192.168.1.100:6385- 192.168.1.100:6386

2 測試類,注意:{user}: 這樣的標識,名稱無所謂,只要都加了相同的標識,寫了些反例和正例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.Arrays;
import java.util.List;@SpringBootTest(classes = Zha7zha8Application.class)
public class RedisClusterTest {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 反例:未使用 Hash Tags,可能導致 Key 分配到不同的 Slot* 注意:由于 'user:dfss' 和 'user:00' 沒有共同的 Hash Tag,*      這些鍵可能會被分配到不同的槽中,這在某些情況下(如 multiGet)可能會導致問題。*      例如,在Redis集群環境中,如果這些鍵位于不同的節點上,那么 multiGet 可能無法正確返回所有鍵的值。*/@Testvoid testWithoutHashTags() {// 定義兩個沒有使用 Hash Tags 的鍵String key1 = "user:dfss";String key2 = "user:11";// 設置鍵值對redisTemplate.opsForValue().set(key1, "Alice");redisTemplate.opsForValue().set(key2, "Bob");// 嘗試從 Redis 中獲取這兩個值List<String> values = redisTemplate.opsForValue().multiGet(Arrays.asList(key1, key2));System.out.println("從 Redis 中獲取的值 (無 Hash Tags): " + values);}/*** 正例:使用 Hash Tags 確保 'user:1' 和 'user:2' 在同一個 Slot*      使用相同的 Hash Tag '{user}' 確保了 'user:1' 和 'user:2' 被分配到同一個槽中,*      這樣可以保證 multiGet 操作能夠成功返回所有相關的鍵值。*/@Testvoid testWithHashTags() {// 定義兩個使用相同 Hash Tags 的鍵String key1 = "{user}:1";String key2 = "{user}:2";// 設置鍵值對redisTemplate.opsForValue().set(key1, "Alice");redisTemplate.opsForValue().set(key2, "Bob");// 從 Redis 中獲取這兩個值List<String> values = redisTemplate.opsForValue().multiGet(Arrays.asList(key1, key2));System.out.println("從 Redis 中獲取的值 (有 Hash Tags): " + values);}/*** Pipeline 操作反例* 注意:由于 'user:1' 和 'user:2' 沒有共同的 Hash Tag,*      這些鍵可能會被分配到不同的槽中。雖然 pipeline 操作會嘗試執行所有的命令,*      但如果涉及到跨多個節點的操作,可能會導致部分命令失敗或效率降低。*/@Testvoid pipelineOperationWithoutHashTags() {// 定義兩個沒有使用 Hash Tags 的鍵String key1 = "user:1";String key2 = "user:2";// Pipeline 操作List<Object> results = redisTemplate.executePipelined((RedisCallback<String>) connection -> {connection.set(key1.getBytes(), "Alice".getBytes());connection.set(key2.getBytes(), "Bob".getBytes());return null;});System.out.println("Pipeline 操作的結果 (無 Hash Tags): " + results);}/*** Pipeline 操作正例* 使用相同的 Hash Tag '{user}' 確保了 'user:1' 和 'user:2' 被分配到同一個槽中,* 這使得 pipeline 操作能夠在同一節點上順利執行,提高了操作的一致性和效率。*/@Testvoid pipelineOperationWithHashTags() {// 定義兩個使用相同 Hash Tags 的鍵String key1 = "{user}:1";String key2 = "{user}:2";// Pipeline 操作List<Object> results = redisTemplate.executePipelined((RedisCallback<String>) connection -> {connection.set(key1.getBytes(), "Alice".getBytes());connection.set(key2.getBytes(), "Bob".getBytes());return null;});System.out.println("Pipeline 操作的結果 (有 Hash Tags): " + results);}
}

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

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

相關文章

優選算法訓練篇07--力扣LCR179.查找總價格為目標值的兩個商品

目錄 1.題目鏈接&#xff1a;LCR179.查找總價格為目標值的兩個商品 2.題目描述&#xff1a; 3.解法一(暴力解法&#xff0c;會超時)&#xff1a; 4.解法二(雙指針-對撞指針): 1.題目鏈接&#xff1a;LCR179.查找總價格為目標值的兩個商品 2.題目描述&#xff1a; 購物車…

KMP-子串匹配算法-關鍵點理解

1.理解next[]數組的使用與來歷 2.求解next[]數組 一、kmp算法的原理 首先觀察暴力解法&#xff1a;假設主串為&#xff1a;abdxxabc&#xff0c;模式串為abxxabd。 暴力解法&#xff0c;就是對主串每個字符作為第一個字符&#xff0c;開始和模式串比較。 比如&#xff1a;從…

Flutter 學習之旅 之 flutter 使用 SQLite(sqflite) 實現簡單的數據本地化 保存/獲取/移除/判斷是否存在 的簡單封裝

Flutter 學習之旅 之 flutter 使用 SQLite&#xff08;sqflite&#xff09; 實現簡單的數據本地化 保存/獲取/移除/判斷是否存在 的簡單封裝 目錄 Flutter 學習之旅 之 flutter 使用 SQLite&#xff08;sqflite&#xff09; 實現簡單的數據本地化 保存/獲取/移除/判斷是否存在…

群體智能優化算法-粒子群優化算法(Particle Swarm Optimization, PSO,含Matlab源代碼)

摘要&#xff08;Abstract&#xff09; 粒子群優化&#xff08;PSO&#xff09;是一種基于群體智能的優化算法&#xff0c;受鳥群覓食行為的啟發。PSO 通過模擬粒子&#xff08;個體&#xff09;在搜索空間中的運動來尋找最優解。每個粒子根據自身的歷史最優位置&#xff08;p…

Redis 在windows下的下載安裝與配置

參考鏈接:https://developer.aliyun.com/article/1395346 下載 Redis 訪問 Redis 下載地址&#xff1a;https://github.com/tporadowski/redis/releases 下載 Redis 時&#xff0c;你可以選擇 ZIP 包或 MSI 安裝&#xff1a; ZIP包&#xff1a;需要手動解壓、初始化、配置和…

UE5材質法線強度控制節點FlattenNormal

連法 FlattenNormal內部是這樣的 FlattenNormal的作用是用來調整法線強度 連上FlattenNormal后 拉高數值

在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索

作者&#xff1a;來自 Elastic Chris Hegarty 及 Hemant Malik 由 NVIDIA cuVS 提供支持&#xff0c;此次合作旨在為開發者在 Elasticsearch 中的向量搜索提供 GPU 加速。 在 Elastic Engineering 組織內&#xff0c;我們一直致力于優化向量數據庫的性能。我們的使命是讓 Lucen…

Android 13深度定制:SystemUI狀態欄時間居中顯示終極實戰指南

一、架構設計與技術解析 1. SystemUI狀態欄核心布局機制 層級結構 mermaid 復制 graph TDPhoneStatusBarView --> StatusBarContents[status_bar_contents]StatusBarContents --> LeftLayout[status_bar_left_side]StatusBarContents --> ClockLayout[Clock控件]Left…

ArcGIS10.X影像智能下載!遷移ArcGIS Pro批量智能高清影像下載工具至ArcGIS!

上周我們分享了 我寫的一個ArcGIS Pro版批量下載高清影像&#xff08;谷歌、天地圖、ESRI等&#xff09;工具給大家&#xff0c;Deepseek我&#xff01;寫一個ArcGIS Pro批量下載高清影像&#xff08;谷歌、天地圖、ESRI等&#xff09;工具給大家-CSDN博客文章瀏覽閱讀130次。深…

前端面經分享(25/03/19)

北京一家做協同辦公軟件出海的公司&#xff0c;技術一面&#xff0c;20k-40k&#xff0c;要求3-5年 詳細聊了一下上家公司的項目上家公司的項目是不做了嗎&#xff0c;離職原因是什么&#xff0c;你覺得公司的這個產品怎么樣在做AI類的業務時&#xff0c;作為前端感覺跟常規業務…

7 款可視化爬蟲工具全解析:案例示范與操作指南

目錄 1. ParseHub 2.WebHarvy 3.DataMiner 4.Dexi.io 5.ContentGrabber 6.Portia 7.UiPath 文檔聚焦 7 款熱門可視化爬蟲工具&#xff0c;突出簡便的可視化操作&#xff0c;簡單拖拽、設置&#xff0c;無需編程知識&#xff0c;人人皆可上手。 1. ParseHub ParseHub 是一…

使用 `pytest` 框架時,可以通過極限封裝將 YAML 文件的讀取、解析

在使用 pytest 框架時,可以通過極限封裝將 YAML 文件的讀取、解析和測試用例的通用邏輯封裝成共享的方法或 fixture,從而減少重復代碼。以下是詳細的實現步驟和示例。 1. 封裝 YAML 文件讀取和解析 將 YAML 文件的讀取和解析邏輯封裝到一個工具函數中,供所有測試用例調用。…

HarmonyOS next性能優化:多維度策略與實戰案例

HarmonyOS next性能優化&#xff1a;多維度策略與實戰案例 在HarmonyOS next開發中&#xff0c;性能優化是提升用戶體驗、確保應用流暢運行的關鍵。本文將從多個角度探討HarmonyOS next的性能優化策略&#xff0c;并通過示例代碼展示優化前后的效果對比&#xff0c;幫助開發者…

springboot項目,mapper.xml里面,jdbcType報錯 已解決

找了很多資料&#xff0c;最后發現原來是依賴版本不兼容的問題。改了版本號即可 報錯原因&#xff1a; springboot版本為2.16.3 但是我導入的依賴版本是3.0.1&#xff0c;不兼容&#xff0c;報錯 解決&#xff1a;修改版本號&#xff0c;2.3.1兼容springboot2.6.x。依賴下載完…

rust學習筆記16-206.反轉鏈表(遞歸)

rust函數遞歸在14中已經提到&#xff0c;接下來我們把206.反轉鏈表&#xff0c;用遞歸法實現 遞歸函數通常包含兩個主要部分&#xff1a; 基準條件&#xff08;Base Case&#xff09;&#xff1a;遞歸終止的條件&#xff0c;避免無限遞歸。 遞歸步驟&#xff08;Recursive Ste…

QT-LINUX-Bluetooth藍牙開發

BlueToothAPI QT-BlueToothApi Qt Bluetooth 6.8.2 官方提供的藍牙API不支持linux。 D-Bus的API實現藍牙 確保系統中安裝了 BlueZ(版本需≥5.56),并且 Qt 已正確安裝并配置了 D-Bus 支持。 默默看了下自己的版本.....D-BUS的API也不支持。 在 D-Bus 中,org 目錄是 D-Bus…

鴻蒙Next開發與未來發展的變革:全場景操作系統的全新紀元

文章目錄 引言&#xff1a;從兼容到自主的跨越式進化一、鴻蒙Next技術架構解析1.1 系統架構全景圖1.1.1 微內核架構優勢 1.2 與OpenHarmony的關系 二、開發范式革命2.1 應用開發模式對比2.1.1 元服務&#xff08;Meta Service&#xff09;定義 2.2 開發工具鏈升級&#xff08;D…

【docker】--- 詳解 WSL2 中的 Ubuntu 和 Docker Desktop 的區別和關系!

在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。【WSL 】--- Windows11 遷移 WSL 超詳細指南 —— 給室友換一個宿舍! 開發環境一、引…

利用Python爬蟲獲取Shopee(蝦皮)商品詳情:實戰指南

在跨境電商領域&#xff0c;Shopee&#xff08;蝦皮&#xff09;作為東南亞及臺灣地區領先的電商平臺&#xff0c;擁有海量的商品信息。無論是進行市場調研、數據分析&#xff0c;還是尋找熱門商品&#xff0c;獲取Shopee商品詳情都是一項極具價值的任務。然而&#xff0c;手動…

【OCR】總結github上開源 OCR 工具:讓文字識別更簡單

前言 在數字化的時代&#xff0c;光學字符識別&#xff08;OCR&#xff09;技術成為了我們處理文檔、圖像文字信息的得力助手。它能夠將圖像中的文字信息轉換為可編輯和可處理的文本數據&#xff0c;極大地提高了信息處理的效率。今天&#xff0c;我要給大家介紹一些優秀的開源…