【Spring连载】使用Spring Data访问Redis(六)----Redis集群 Cluster

【Spring连载】使用Spring Data访问Redis(六)----Redis集群 Cluster

  • 一、使用Redis集群连接
  • 二、使用RedisTemplate 和 ClusterOperations

使用Redis Cluster需要Redis Server 3.0+版本。有关更多信息,请参阅 集群教程。当将Redis Repositories和Redis Cluster一同使用时,请参阅如何 在Redis集群上运行Redis Repositories。

一、使用Redis集群连接

Redis集群的行为与单节点Redis甚至Sentinel监控的master-replica环境不同。这是因为自动分片将key映射到16384个槽中的一个,这些槽分布在各节点中。因此,涉及多个key的命令必须断言(assert)所有key映射到完全相同的槽,以避免跨槽错误。单个集群节点仅提供一组专用keys。针对一个特定服务器发出的命令只返回该服务器提供的keys的结果。以KEYS命令作为一个简单的例子。当命令发布到集群环境中的服务器时,它只返回请求发送到的节点所匹配出的keys,而不返回集群中的所有符合条件的keys。因此,要获得集群环境中的所有keys,必须从所有已知的主节点读取keys。
虽然特定keys到相应槽服务节点(slot-serving node)的重定向由驱动程序库处理,但RedisClusterConnection涵盖了更高级别的功能,如跨节点收集信息或向群集中的所有节点发送命令。选取前面的keys示例,这意味着keys(pattern)方法选取集群中的每个主节点,并同时在每个主节点上运行keys命令,同时提取结果并返回累积的keys集合。如果只请求单个节点的keys,RedisClusterConnection为这些方法提供了重载(例如,keys(node, pattern))。
RedisClusterNode可以从RedisClusterConnection.clusterGetNodes获得,也可以使用主机和端口或节点Id来构建。
以下示例展示了在集群中运行的一组命令:
例1:在集群上运行命令示例

redis-cli@127.0.0.1:7379 > cluster nodes1. 6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      2. 7bb78c... 127.0.0.1:7380 master - 0 1449730618304 2 connected5461-109223. 164888... 127.0.0.1:7381 master - 0 1449730618304 3 connected 10923-163834. b8b5ee... 127.0.0.1:7382 slave 6b38bb... 0 1449730618304 25 connectedRedisClusterConnection connection = connectionFactory.getClusterConnnection();5. connection.set("thing1", value);6. connection.set("thing2", value);7. connection.keys("*");                                                8. connection.keys(NODE_7379, "*");                                    9. connection.keys(NODE_7380, "*");                            10. connection.keys(NODE_7381, "*");11. connection.keys(NODE_7382, "*");1. 服务槽0到5460的主节点被复制到位于7382的副本2. 主节点,服务槽位5461 ~ 109223. 主节点,服务槽位10923 ~ 163834. 副本节点,保存7379主节点的副本5. 请求路由到7381节点,服务槽121826. 请求路由到7379节点,服务槽位50617. 请求路由到节点7379,7380,7381→[thing1, thing2]8. 请求路由到节点7379→[thing2]9. 请求路由到节点7380→[]10. 请求路由到节点7381→[thing1]11. 请求路由到节点7382→[thing2]

当所有key映射到同一槽时,native驱动程序库会自动提供跨槽请求,如MGET。然而,一旦情况并非如此,RedisClusterConnection就会对槽服务节点(slot-serving nodes)运行多个并行GET命令,并返回累积结果。这种方法的性能不如单槽方法,因此应谨慎使用。如果有疑问,可以考虑通过在花括号中提供前缀将keys固定到同一个槽,例如{my-prefix}.thing1和{my-prefix}.thing2,这两个前缀都将映射到同一槽编号。以下示例展示跨插槽请求处理:
例2:跨槽请求处理示例

  redis-cli@127.0.0.1:7379 > cluster nodes1. 6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      7bb...RedisClusterConnection connection = connectionFactory.getClusterConnnection();connection.set("thing1", value);           // slot: 12182connection.set("{thing1}.thing2", value);  // slot: 12182connection.set("thing2", value);           // slot:  54612. connection.mGet("thing1", "{thing1}.thing2");                                  3. connection.mGet("thing1", "thing2");                                           1. 与前面示例中的配置相同。2. 键映射到同一个槽 → 127.0.0.1:7381 MGET thing1 {thing1}.thing23. 键映射到不同的槽,并被分割进单个槽,路由到相应的节点→ 127.0.0.1:7379 GET thing2→ 127.0.0.1:7381 GET thing1

前面的示例演示了Spring Data Redis所遵循的一般策略。请注意,有些操作可能需要将大量数据加载到内存中才能计算所需的命令。此外,并非所有跨槽请求都可以安全地移植到多个单槽请求,如果误用,则会出现错误(例如,PFCOUNT)。

二、使用RedisTemplate 和 ClusterOperations

有关RedisTemplate的一般用途、配置和用法的信息,请参阅“通过RedisTemplate处理对象”部分。
使用任何JSON RedisSerializers设置RedisTemplate#keySerializer时要小心,因为更改JSON结构会直接影响哈希槽计算。
RedisTemplate通过ClusterOperations接口提供对集群特定操作的访问,该接口可以从RedisTemplate.opsForCluster()获得。这使你可以在集群中的单个节点上显式运行命令,同时保留为template配置的序列化和反序列化功能。它还提供管理命令(如CLUSTER MEET)或更高级的操作(如resharding)。
以下示例展示如何使用RedisTemplate访问RedisClusterConnection:
例3:使用RedisTemplate访问RedisClusterConnection

   ClusterOperations clusterOps = redisTemplate.opsForCluster();1. clusterOps.shutdown(NODE_7379);                                              1. 关闭7379节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662920.shtml

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

相关文章

51单片机编程应用(C语言):模块化编程

下面我们模块化几个函数: Delay.c //延时子函数 void Delay(unsigned int xms) {unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);} } Delay.h #ifndef __DELAY_H__ #define __DELAY_H__void Delay(unsigned int xms);#endifNixie.h …

js 设置、获取、删除标签属性以及H5自定义属性

1. 设置标签属性 使用setAttribute()(‘属性名’, ‘属性值’)方法可以添加、修改、删除属性。   下面的demo是为input添加、修改、删除value属性&#xff1a; 1.1. HTML <input type"text" class"input"> <input type"text" class…

有没有合适写毕业论文的AI工具?

最近挺多同学在忙着写毕业论文&#xff0c;不断在“提交-打回-修改-提交”过程里循环着&#xff0c;好不容易写完了&#xff0c;还得考虑论文查重的问题&#xff01;基哥作为一名曾经的毕业生&#xff0c;当然也体验过这种痛苦了。 但是&#xff0c;大人&#xff0c;时代变了&…

无法在 word 中登录 Grammarly

目录 1. 情况描述 2. 解决方法 3. 原因分析 1. 情况描述 在浏览器中可以登录 Grammarly&#xff0c;但是在 word 中登录失败&#xff0c;大致如下图所示&#xff1a; 我自己没有截图&#xff0c;这是网上别人的图&#xff0c;但差不多都长这个样子。 2. 解决方法 我点击了…

推荐一个好用的人脑解剖结构及功能注释3D图谱——3D Brain

大脑是一个非凡的结构&#xff0c;它定义了我们是谁&#xff0c;以及我们如何体验世界。神经成像技术的最新进展使我们能够看到大脑内部&#xff0c;让我们能够看到构成大脑的组成部分并了解它们对应的功能。大脑的大体结构对大多数人来说都很熟悉。 前脑的外层构成了我们熟悉…

【ASP.NET Core 基础知识】--Web API--创建和配置Web API(二)

书接上文&#xff0c;继续讲。 一、数据访问与数据库配置 集成Entity Framework Core&#xff08;EF Core&#xff09;是在ASP.NET Core Web API中进行数据库访问的常见方式。以下是集成EF Core的基本步骤&#xff1a; 安装Entity Framework Core包&#xff1a; 在你的ASP.NE…

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符&#xff1a; 大小写字母、数字、标点符号及一些其它符号元字符&#xff1a; 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

MySQL 备份恢复

1.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了。 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数…

2024 高级前端面试题之 前端安全模块 「精选篇」

该内容主要整理关于 前端安全模块 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 前端安全模块精选篇 1. 代码注入XSS如何攻击如何防御cookie 如何防范 XSS 攻击 2. 跨站请求伪造CSRF3. 浏览器同源策略 SOP4. 跨域资源共享 CORS5. 密码…

机器学习2-简单的二分类问题

需求&#xff1a; 假设现在需要对数据进行二分类&#xff0c;小于0.5的&#xff0c;打上0的标记&#xff0c;大于0.5的&#xff0c;打上1的标记&#xff0c;怎么做&#xff1f; 分析&#xff1a; 这是一个简单的二分类问题&#xff0c;使用逻辑回归模型。 代码&#xff1a; …

【PostgresSQL系列】 ltree简介及基于SpringBoot实现 ltree数据增删改查

本文将对PostgresSQL中的ltree进行相关概念介绍&#xff0c;并以示例代码讲解ltree数据增删改查功能的实现。 作者&#xff1a;后端小肥肠 目录 1.前言 2. 基础概念 2.1. ltree 2.2. lquery 2.3. ltxtquery 2.4. ltree函数及操作符 2.4.1. ltree函数 2.4.2. ltree操作符…

Python实现TCP和UDP通信

目录 一&#xff1a;TCP 二&#xff1a;UDP 一&#xff1a;TCP 在Python中实现TCP通信可以通过使用内置的socket模块来完成。以下是一个简单的示例&#xff0c;展示了如何使用Python的socket模块创建一个TCP客户端和服务器。 TCP服务器 import socket def start_server(): s…

Linux之系统安全与应用续章

目录 一. PAM认证 1.2 初识PAM 1.2.1 PAM及其作用 1.2.2 PAM认证原理 1.2.3 PAM认证的构成 1.2.4 PAM 认证类型 1.2.5 PAM 控制类型 二. limit 三. GRUB加密 /etc/grub.d目录 四. 暴力破解密码 五. 网络扫描--NMAP 六. 总结 一. PAM认证 1.2 初识PAM PAM是Linux系…

【深蓝学院】移动机器人运动规划--第3章 基于采样的路径规划--作业

0. Assignment T1. MATLAB实现RRT 1.1 GPT-4任务分析 RRT伪代码&#xff1a; 任务1即使用matlab实现RRT&#xff0c;结合作业所给框架&#xff0c;简单梳理&#xff0c;可结合1.2代码理解&#xff1a; 设置start&#xff0c;goal&#xff0c;near to goal threshold Thr&am…

react+ts

1.概念 React和TypeScript集合使用的重点集中在 存储数据/状态有关的Hook函数以及组件接口的位置&#xff0c;这些地方最需要数据类型校验 2.使用Vite创建项目 Vite是前端工具链工具&#xff0c;可以帮助我们快速创建一个 reactts 的工程化环境出来 Vite官网&#xff1a;ht…

2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的D题&#xff01; 完整内容可以在文章末尾领…

子查询练习2

数据表 链接&#xff1a;https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码&#xff1a;b0rp --来自百度网盘超级会员V5的分享 1.查询和Zlotkey相同部门的员工姓名和工资 2.查询工资比公司平均工资高的员工的员工号,姓名和工资 3.查询工资大于所有JOB_IDSA_MAN的员工…

大白话理解大型语言模型(LLM):预训练和微调

引言&#xff1a; 在人工智能的世界里&#xff0c;大型语言模型&#xff08;LLM&#xff09;已成为一种强大的工具&#xff0c;它们不仅能理解和生成自然语言&#xff0c;还能在各种复杂任务中表现出色。本文将深入探讨这些模型的两个关键阶段&#xff1a;预训练和微调&#xf…

Python中的单元测试框架:使用unittest进行有效测试

一、介绍 在软件开发中&#xff0c;单元测试是一种测试方法&#xff0c;它用于检查单个软件组件&#xff08;例如函数或方法&#xff09;的正确性。Python 提供了一个内置的单元测试库&#xff0c;名为 unittest&#xff0c;可以用来编写测试代码&#xff0c;然后运行测试&…

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证

如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证 引言crypto/ed25519 算法简介环境搭建和准备工作生成密钥对进行数字签名 验证签名实际应用场景案例总结 引言 在当今数字化时代&#xff0c;网络安全显得尤为重要。无论是在网上进行交易、签署合同&#xff0c;还是发…