当前位置: 首页 > news >正文

Spring Boot + Redis Cluster 测试

🌟 Spring Boot + Redis Cluster 测试全指南

Redis Cluster 是 Redis 提供的原生分片和高可用方案。在 Spring Boot 项目中,我们通常使用 Spring Data Redis + Lettuce/Jedis 来连接 Cluster,实现自动分片、故障切换和高可用访问。本文将手把手讲解如何搭建一个 Spring Boot + Redis Cluster 测试案例。


📌 一、项目环境

  • Spring Boot 3.5.x
  • JDK 17+
  • Maven 或 Gradle
  • Redis Cluster(3 主 3 从,本教程假设端口 7000~7005)
  • Lettuce 客户端(Spring Boot 默认)

Docker Compose 安装 Redis 集群(三主三从)


📦 二、项目结构

springboot-redis-cluster/
├─ src/
│  ├─ main/
│  │  ├─ java/com/example/rediscluster/
│  │  │  ├─ RedisClusterApplication.java
│  │  │  ├─ config/RedisConfig.java
│  │  │  └─ service/RedisService.java
│  │  └─ resources/
│  │     └─ application.yml
└─ pom.xml
  • Spring Boot + Redis Cluster 访问流程
1. 获取 RedisTemplate / LettuceClusterConnection
2. 查询 key 所在 slot
3. 定位对应 Master 节点
4. 执行读写操作
5. 主节点复制数据
6. 返回结果
MOVED / ASK 重定向
Spring Boot 应用
Lettuce Cluster Client
Redis Cluster Slot Table
Redis Master 节点
Master 数据存储
Slave 从节点

📝 三、配置文件

1️⃣ Maven 依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Redis Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2️⃣ application.yml 配置

spring:data:redis:timeout: 5000mscluster:max-redirects: 3nodes:- 192.168.3.150:7000- 192.168.3.150:7001- 192.168.3.150:7002- 192.168.3.150:7003- 192.168.3.150:7004- 192.168.3.150:7005
🔹 配置说明
配置项作用
nodesRedis Cluster 节点列表
max-redirects当遇到 MOVED 或 ASK 重定向时,客户端最大重试次数
timeout连接超时时间

为什么这么配置

  • Cluster 节点列表必须包含所有主节点(最好加上从节点以提高容错)
  • max-redirects 避免无限循环重定向

🔧 四、Redis 配置类

package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic LettuceConnectionFactory redisConnectionFactory() {// 配置集群节点RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration().clusterNode("192.168.3.150", 7000).clusterNode("192.168.3.150", 7001).clusterNode("192.168.3.150", 7002).clusterNode("192.168.3.150", 7003).clusterNode("192.168.3.150", 7004).clusterNode("192.168.3.150", 7005);clusterConfig.setMaxRedirects(3); // 最大重定向次数return new LettuceConnectionFactory(clusterConfig);}@Beanpublic RedisTemplate<String, String> redisTemplate(LettuceConnectionFactory factory) {RedisTemplate<String, String> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 使用 String 序列化 key/valuetemplate.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}
}

为什么这么配置

  • RedisClusterConfiguration 指定集群节点,客户端会自动处理 MOVED/ASK 重定向
  • LettuceConnectionFactory 支持线程安全和连接池
  • RedisTemplate 使用 String 序列化保证 key/value 可读性

💡 五、Redis Service 示例

package com.example.rediscluster.service;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RedisService {private final RedisTemplate<String, String> redisTemplate;public RedisService(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;}public void setValue(String key, String value, long timeoutSeconds) {redisTemplate.opsForValue().set(key, value, timeoutSeconds, TimeUnit.SECONDS);}public String getValue(String key) {return redisTemplate.opsForValue().get(key);}public boolean exists(String key) {return Boolean.TRUE.equals(redisTemplate.hasKey(key));}public void delete(String key) {redisTemplate.delete(key);}
}

🧪 六、测试案例

package com.example.rediscluster;import com.example.rediscluster.service.RedisService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import jakarta.annotation.Resource;@SpringBootTest
public class RedisClusterTest {@Resourceprivate RedisService redisService;@Testpublic void testRedisCluster() {String key = "test-key";String value = "hello-cluster";// 写入redisService.setValue(key, value, 60);// 读取String result = redisService.getValue(key);System.out.println("读取结果: " + result);// 检查存在boolean exists = redisService.exists(key);System.out.println("是否存在: " + exists);// 删除redisService.delete(key);boolean existsAfterDelete = redisService.exists(key);System.out.println("删除后是否存在: " + existsAfterDelete);}
}

✅ 说明:

  • 无需关心具体 key 落在哪个节点,客户端会自动处理 Cluster 重定向
  • 适合测试集群写入、读取和高可用特性

在这里插入图片描述
查看数据,进入到 7000,7004 主从,其他节点没有。
在这里插入图片描述


🔹 七、注意事项

  1. 不要只连接单节点
    • Cluster 模式必须至少指定一个主节点,最好列出多个节点提高容错
  2. MOVED/ASK 自动处理
    • Lettuce/Jedis 都会自动处理,无需手动跳转
  3. 连接池配置
    • 高并发场景下必须配置连接池,避免线程阻塞
  4. 数据分片透明化
    • Redis Cluster 客户端对应用透明,应用不需要关心槽位映射

🎯 八、总结

  • 本文搭建了 Spring Boot + Redis Cluster 测试案例
  • 完整演示了:
    • 配置 Redis Cluster 节点
    • 使用 Lettuce 连接 Spring Boot
    • RedisTemplate 操作 key/value
    • Cluster-aware 写入与读取
  • 讲解了 为什么这么配置
    • 最大重定向保证数据写入正确节点
    • 连接池优化性能
    • 集群客户端自动处理主从切换和故障

通过这种方式,应用可以透明、安全地使用 Redis Cluster,实现分布式缓存和高可用特性,非常适合生产环境和测试环境使用。

http://www.dtcms.com/a/331496.html

相关文章:

  • 回流(Reflow)与重绘(Repaint):浏览器渲染性能优化核心
  • 演员念真主演《镇恶追凶》辽宁杀青
  • 数字电路上的通讯速度是越快越好还是越慢越好?
  • 【二分图】染色问题
  • 企业智脑UMI AIGC SaaS:解锁AI时代全场景生产力,中小微企业转型利器
  • Linux学习-多任务(进程)
  • **隐私沙盒:发散创新之光**随着互联网技术的飞速发展,数据安全和隐私保护逐渐成为人们关注的焦点。隐私沙盒作为一种新兴
  • Ping32 与绿盾再对比:Ping32 以创新与适配领跑数据安全​
  • 机器学习内容总结
  • 机器学习-基础入门:从概念到核心方法论
  • MySQL进阶——优化、日志
  • 第4节课:多模态大模型的核心能力(多模态大模型基础教程)
  • 疏老师-python训练营-Day45Tensorboard使用介绍
  • StarRocks优化统计分析
  • 好用的开源数据可视化设计工具LIGHT CHASER
  • Java List 集合详解(ArrayList、LinkedList、Vector)
  • pyecharts可视化图表-pie:从入门到精通
  • 适用工业分选和工业应用的高光谱相机有哪些?什么品牌比较好?
  • 这个就是哈希冲突
  • AI出题人给出的Java后端面经(十四)(日更)
  • 智慧养老解决方案:破解“最后一公里”服务难题
  • 【98页PPT】智慧方案某著名企业汽配行业ERP整体解决方案(附下载方式)
  • BGP笔记及实验
  • 网络层协议——IP
  • 2025年机器视觉与信号处理国际会议(MVSP 2025)
  • 72小时到24小时:台风“杨柳”过后,有鹿机器人如何为园区按下“加速键”?
  • SpringBoot 实现在线查看内存对象拓扑图 —— 给 JVM 装上“透视眼”
  • 面试题之项目中灰度发布是怎么做的
  • 16 ABP Framework CLI
  • Steam修改游戏安装目录