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.mzph.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;我要给大家介绍一些优秀的开源…