Spring Data Redis(Redis Cluster)

SpringBoot Data Redis连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构,因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后,使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。在某些部署中,Redis 群集节点地址发现失败,因为地址是 NAT-ted 或者因为端口被转发(典型的情况是Docker 和其他集装箱)为了让 Redis 集群在这样的环境中工作,静态配置,每个节点都知道它的公共地址是必需的。知道这个问题就好办了。有些网上的解决方法,不一定是我们真正需要的,凡是还是要自己去探索和动脑。 阅读详情

Redis Cluster

使用Redis Cluster 需要Redis 服务版本3.0以上,Redis Cluster 提供了一套独有的特性和功能。查看Redis 官网以获得更多信息。

只有jedis 和 lettuce 支持Redis Cluster。

1. Enabling Redis Cluster

集群的支持是基于非集群通讯构建的。RedisClusterConnection 是RedisConnection 的一个扩展,用来处理和Redis Cluster的通讯,转换错误信息到Spring DAO异常层。RedisClusterConnection 是通过RedisConnectionFactory 创建的,该工程的创建要依据于RedisClusterConfiguration配置。

Example 1. Sample RedisConnectionFactory Configuration for Redis Cluster

@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {

    /*
     * spring.redis.cluster.nodes[0] = 127.0.0.1:7379
     * spring.redis.cluster.nodes[1] = 127.0.0.1:7380
     * ...
     */
    List<String> nodes;

    /**
     * Get initial collection of known cluster nodes in format {@code host:port}.
     *
     * @return
     */
    public List<String> getNodes() {
        return nodes;
    }

    public void setNodes(List<String> nodes) {
        this.nodes = nodes;
    }
}

@Configuration
public class AppConfig {

    /**
     * Type safe representation of application.properties
     */
    @Autowired ClusterConfigurationProperties clusterProperties;

    public @Bean RedisConnectionFactory connectionFactory() {

        return new JedisConnectionFactory(
            new RedisClusterConfiguration(clusterProperties.getNodes()));
    }
}
RedisClusterConfiguration can also be defined via PropertySource.
RedisClusterConfiguration 也可以通过PropertySource 来定义。
Configuration Properties

    spring.redis.cluster.nodes: Comma delimited list of host:port pairs.

    spring.redis.cluster.max-redirects: Number of allowed cluster redirections.
这个初始化的配置为驱动库指定了一组初始化集群节点。集群可以在线修改配置,但修改结果只会保存在本驱动的内存中,不会写入到配置文件中。

2. Working With Redis Cluster Connection

如上面提到的,Redis Cluster的行为和Redis 的单节点不同,甚至和一个Sentinel 监控的主从模式也不一样。主要原因是集群自动分片,将一个key 映射到16384个槽中的一个,这些槽分布在多个节点上。因此操作多个key 的命令必须保证所有的key 都映射到同一个槽上,避免跨槽执行错误。更进一步说,今后一个单独的集群节点,只服务于一组专用的keys,请求一个命令到一个Server,只能得到该Server 上拥有keys 的对应结果。一个非常简单的例子是执行KEYS命令,当发布该命令到集群环境中的某个节点是,只能得到该节点上拥有的keys,而不是集群中所有的keys。所以要得到集群中所有的keys,必须从集群的所有主节点上获取所有的keys。

驱动库会处理将一个特定的keys 重定向到对应的槽节点上,更高级的功能,像跨节点收集信息,或发送命令到集群的所有节点上,都由RedisClusterConnection 来处理。像前面获取所有keys 的例子,需要keys(模式)方法来获取集群中每一个主节点的keys,就是说要执行KEYS 命令在每一个节点上,然后获取结果返回累加的所有keys。其实仅仅需要请求keys 到一个单独节点的RedisClusterConnection 上就可以驱动上面所有的处理(如 keys(node,pattern))。

获取一个RedisClusterNode 有多种方式,可以通过RedisClusterConnection.clusterGetNodes 方法,或通过host 和port构建,或通过Id 构建。

Example 2. Sample of Running Commands Across the Cluster

redis-cli@127.0.0.1:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      
7bb78c... 127.0.0.1:7380 master - 0 1449730618304 2 connected 5461-10922       
164888... 127.0.0.1:7381 master - 0 1449730618304 3 connected 10923-16383      
b8b5ee... 127.0.0.1:7382 slave 6b38bb... 0 1449730618304 25 connected               
RedisClusterConnection connection = connectionFactory.getClusterConnnection();

connection.set("foo", value);                                                  
connection.set("bar", value);                                                  

connection.keys("*");                                                          

connection.keys(NODE_7379, "*");                                               
connection.keys(NODE_7380, "*");                                               
connection.keys(NODE_7381, "*");                                               
connection.keys(NODE_7382, "*");  
Master node serving slots 0 to 5460 replicated to slave at 7382
Master node serving slots 5461 to 10922
Master node serving slots 10923 to 16383
Slave node holding replicates of master at 7379

Request routed to node at 7381 serving slot 12182
Request routed to node at 7379 serving slot 5061
Request routed to nodes at 7379, 7380, 7381 → [foo, bar]
Request routed to node at 7379 → [bar]
Request routed to node at 7380 → []
Request routed to node at 7381 → [foo]
Request routed to node at 7382 → [bar]

当所有的keys 都映射到同一个slot 时,跨slot 的请求像MGET 会被本地驱动库自动处理。然后一旦不是这种情况,RedisClusterConnection 会执行多个并行的GET 命令到多个节点的slot 上,并返回一个累加的结果。很明显这些没有单个slot 执行性能高,因此使用时要当心。毫无疑问,请考虑将所有的keys 聚集到同一个slot 上,可以通过提供一个前缀,像 {my-prefix}.foo 和 {my-prefix}.bar 一样将映射到同一个slot 上。

Example 3. Sample of Cross Slot Request Handling

redis-cli@127.0.0.1:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      
7bb...
RedisClusterConnection connection = connectionFactory.getClusterConnnection();

connection.set("foo", value);         // slot: 12182
connection.set("{foo}.bar", value);   // slot: 12182
connection.set("bar", value);         // slot:  5461

connection.mGet("foo", "{foo}.bar");                                           

connection.mGet("foo", "bar");     
Same Configuration as in the sample before.

Keys map to same slot → 127.0.0.1:7381 MGET foo {foo}.bar
Keys map to different slots and get split up into single slot ones routed to the according nodes
→ 127.0.0.1:7379 GET bar
→ 127.0.0.1:7381 GET foo
上面提供的一些简单示例,展示了Spring Data Redis的整体策略。意识到一些操作需要加载大量的数据到内存中,以便于计算出期望的结果。此外,并不是所有跨slot 的请求都可以安全的被分为多个单slot 请求,如果误用将会产生错误(如 PFCOUNT)。

3. Working With RedisTemplate and ClusterOperations

请参考Working with Objects through RedisTemplate 章节,获悉RedisTemplate 的一般用途、配置和使用情况。

请注意,当使用任何一个Json RedisSerializers来创建RedisTemplete#keySerializer时,改变json 结构会立即对哈希槽的计算产生影响。

RedisTemplate 通过ClusterOperations 接口可以对进行执行特定的操作,而该接口的获取需要调用RedisTemplate.opsForCluster()。可以明确的在集群的单个节点上执行一些命令,同时为模版保留了反序列化/序列化特性,并提供了管理命令像CLUSTER MEET,或更高级的操作如 resharding。

Example 4. Accessing RedisClusterConnection via RedisTemplate

ClusterOperations clusterOps = redisTemplate.opsForCluster();
clusterOps.shutdown(NODE_7379);    
Shut down node at 7379 and cross fingers there is a slave in place that can take over.
在Spring框架中,`org.springframework.data.redis.core.script`包包含了与Redis脚本操作相关的支持 这个类主要用于操作复杂的、需要原子性或跨多个键的操作,比如哈希映射的更新、集合和有序集合的操作(如计算交集、并集、差集等)、甚至是事务管理。包确实包含与Redis脚本操作相关的支持,通常用于执行存储在Redis服务器上的预编译脚本。或其他构建工具的配置文件中是否正确添加并依赖了处理Redis Stream的Spring Data Redis模块,以及其正确的版本。:验证在构建jar包的过程中,是否有遗漏或错误的资源复制,特别是与Redis相关的配置文件或脚本。包包含了与Redis脚本操作相关的支持。 阅读详情

相关推荐

Coursera | 离散数学概论(北大)| quiz答案

Coursera离散数学概论quiz答案Week1:数理逻辑:基本概念Week2:数理逻辑:命题逻辑及形式系统Week3:数理逻辑:谓词逻辑及形式系统Week4:集合论:集合代数   先放下Coursera上找的离散数学部分相关课程:   btw.线上学习拿证书还有很多,MOOC、edm等都可。   博主选了北京大学离散数学概论Discrete Mathematics Generality。Mooc上貌似也有,但是上课时间貌似不如Coursera灵活,Coursera时间自己调度,规定时间上完即可。目前课

小鱼干的博客 4126

Spring整合Redis(六)----Redis集群 Cluster

使用Redis Cluster需要Redis Server 3.0+版本。有关更多信息,请参阅。当将Redis Repositories和Redis Cluster一同使用时,请参阅如何。

爱看技术博客 1095

多期DID实战指南:从CSDID原理到分组加权策略

本文深入解析多期DID(CSDID方法)在政策评估中的实战应用,从核心思想到分组加权策略全面讲解。通过电商扶贫等案例,详细演示如何正确处理分批实施政策的数据分析,包括分组拆解、子模块DID操作及加权平均选择,帮助研究者规避常见误区,提升政策评估的准确性。

weixin_26833503的博客 524

spring-data-redis-cluster集群版配置

集群版的配置,只需要版单机版的连接工厂配置改为集群版即可,即连接多个节点: 注意:在实际开发中,集群版还要加上“哨兵策略”。 单机版配置请看:https://mp.youkuaiyun.com/postedit/88934593 ...

weixin_41758407的博客 1006

01 底盘制动产品之轮速传感器

轮速传感器是用来测量汽车车轮转速的传感器。对于现代汽车而言,轮速信息是必不可少的,汽车动态控制系统(VDC)、汽车电子稳定程序(ESP)、防抱死制动系统(ABS)、自动变速器的控制系统等都需要轮速信息。

汽车软件工程师 | 好奇博主 | 处女座 4654

YOLOv5模型转换陷阱:从PT到RKNN的置信度异常与乱框问题深度解析

本文深度解析了YOLOv5模型从PT到RKNN转换过程中的置信度异常与检测框错乱问题,揭示了NPU硬件特性与模型结构不匹配的根本原因。通过详细的解决方案和实操步骤,包括模型修改、转换流程配置和验证技巧,帮助开发者有效解决这一常见部署难题,提升模型在瑞芯微芯片上的推理性能。

weixin_29062255的博客 902

Spring集成Redis Cluster模式

Spring 集成Redis Cluster模式 1、pom文件添加以下jar <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>...

hekliu的博客 3036

3.4 ISIS和OSPF之间路由引入

通过以上输出可以看到OSPF的路由引入到了IS-IS中。通过以上输出可以看到ISIS的路由没有传递给OSPF。通过以上输出可以看到OSPF的路由没有传递给ISIS。通过以上输出可以看到ISIS的路由被引入进了OSPF。掌握在IS-IS中引入OSPF路由的方法。掌握在OSPF中引入IS-IS路由的方法。图3-3:ISIS和OSPF之间路由引入。在R3上把ISIS的路由引入到OSPF。OSPF引入外部路由的缺省度量值为1。在R3上把OSPF的路由引入到ISIS。引入的外部路由类型为Type2。

lwljh134的博客 1802

SpringDataRedis与Redis Cluster 搭建

2.Redis Cluster 2.1 Redis-Cluster简介 2.1.1 什么是Redis-Cluster 为何要搭建Redis集群。Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以...

a5f4s6f4a65f4a6sf的博客 2516

10分钟搞定小红书爆款笔记爬取!Selenium模拟登录+数据解析全流程,新手也能落地

小红书爬虫实战的核心,是**“模拟真人操作+解析结构化数据”**——Selenium解决了动态页面和登录的问题,lxml解决了数据提取的问题,pandas解决了数据存储的问题。新手学爬虫不用一开始就啃复杂的反爬机制,先从这类“可见即可爬”的场景入手,掌握“模拟操作→数据解析→数据保存”的全流程,再逐步叠加异常处理、批量爬取、反爬应对等功能。需要注意的是:爬取数据仅用于个人学习和研究,不得用于商业用途,且需遵守小红书的用户协议,不要过度爬取导致服务器压力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1728

华为OD机试真题 新系统2026-04-01 C++ 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 375

Spring Data Redis集群部署:Sentinel和Cluster模式的详细配置教程

Spring Data Redis是Java开发者操作Redis的高效工具,它将Spring的模板化设计与Redis的高性能完美结合,显著提升开发效率。本文将详细介绍如何使用Spring Data Redis配置Sentinel和Cluster两种高可用集群模式,帮助你轻松实现Redis的分布式部署。 ## 📌 核心配置类解析 Spring Data Redis提供了两个核心配置类来支持不同

gitblog_00469的博客 481

YoloV10改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。改进方法简单高效,需要发论文的同学不要错过!

m0_47867638的博客 1094

redis-cluster与spring-data-redis集成

[size=medium]因为redis3.0才出来,spring-data-redis正式版本还没有支持redis-cluster。大概上官网看了一下,发现只有1.7.0.RC1才支持,同时没有找到关于jedis与spring-data-redis集成RedisTemplate的资料,所以看了一下原码,写了下面关于RedisTemplate的配置。[/size] [quote]原创:[url]...

langmnm的博客 397

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring Boot+Spring Data Redis访问redis cluster

POM.xml配置 添加对spring-boot-starter-data-redis及jedis的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XML...

chiquejia1105的博客 224

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring-data-redis操作redis cluster

     Redis 3.X版本引入了集群的新特性,为了保证所开发系统的高可用性项目组决定引用Redis的集群特性。对于Redis数据访问的支持,目前主要有二种方式:一、以直接调用jedis来实现;二、使用spring-data-redis,通过spring的封装来调用。下面分别对这二种方式如何操作Redis进行说明。 一、利用Jedis来实现       通过Jedis操作Redis Clu...

weixin_34334744的博客 331

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring data redis cluster 集群

Redis sentinel 官网: https://redis.io/topics/sentinel参考:http://blog.youkuaiyun.com/fengyong7723131/article/details/52983555http://blog.youkuaiyun.com/fengyong7723131/article/details/52995592

优快云 正在崛起的新人---小麦 362

docker搭建redis-cluster,并整合到spring-data-redis

目录环境搭建redis集群1、拉取redis镜像2、配置集群容器数据卷3、启动redis集群服务4、验证集群服务 环境 Mac系统,正常按照官方文档安装docker,这里集群是在一台电脑上模拟 搭建redis集群 1、拉取redis镜像 docker pull redis 2、配置集群容器数据卷 2.1 创建本地路径 #路径可自定义,如果自定义路径,后面用到此路径的命令也需要修改 mkdir -...

Hello_noby的博客 524

spring session +cluster redis(spring-session-data-redis)

pom.xml org.springframework.session spring-session-data-redis 1.2.1.RELEASE redis.clients jedis

blogzlh的专栏 703

redis cluster keyspace expired subscribe use spring boot redis data

redis cluster过期key订阅 开启redis过期key订阅 订阅redis过期key时间 开启redis过期key订阅 首先通过这篇文章了解下相关的配置和单机版的该如何使用,然后如果你配置redis集群时没有开启EKx,那么也可以通过redis-cli -c -p port CONFIG set notify-keyspace-events EKx的方式开启,需要每个节点都设置一下...

weixin_38783585的博客 739

通过spring配置redis cluster

上周spring data redis更新了1.7.1版本,正式支持redis cluster集群模式,这里就介绍一下关于redis cluster集群的相关配置,例如redis连接池等内容。不过想要使用redis cluster集群的话,还是需要你先启动redis cluster才行,具体操作可以参考我之前的redis cluster集群搭建。   1、与之前的文章相同,不采用xml,而...

zk_chs的博客 1733

spring + spring-data-redist + Redis 单机、集群(cluster模式,哨兵模式)

一、单机redis配置 1. 配置redis连接池 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 控制一个pool可分配多少个jedis实例 --> <property name="maxTotal" value="$...

weixin_33883178的博客 204

Spring Data Redis(Redis Repositories running on Cluster)

Redis Repositories running on Cluster在Redis 集群环境中使用Redis 仓储支持是很好的。请参阅Redis Cluster 章节以了解ConnectionFactory 的详细配置信息。仍然需要做一些考虑,因为默认的键分布会通过整个集群和它的槽来传播实体和二级索引。当涉及到一些keys 映射到同一个槽时,像SINTER 和 SUNION 的一些命令只能在服务

秀才的专栏 1546

Spring-data-redis works with AWS Elasticache cluster-mode-disabled

Spring-data-redis works with AWS Elasticache cluster-mode-disabled

Eddyx的专栏 691
上一篇: Spring Boot 性能优化
下一篇: Spring Data Redis(Redis Repositories)
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值