惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
C
Cisco Blogs
博客园 - Franky
有赞技术团队
有赞技术团队
雷峰网
雷峰网
博客园 - 聂微东
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
NISL@THU
NISL@THU
P
Palo Alto Networks Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
宝玉的分享
宝玉的分享
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
W
WeLiveSecurity
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
博客园 - 【当耐特】
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
The Last Watchdog
The Last Watchdog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
S
Schneier on Security
腾讯CDC
Google DeepMind News
Google DeepMind News
小众软件
小众软件
量子位
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX

博客园 - 意犹未尽

从提示词工程到 Harness 设计范式 VsCode AI生态开源项目 jvm堆外内存-direct buffer spring-boot-actuator-Health原理 服务治理 概念、架构、协议格式到裸协议实现,彻底搞懂 MCP 的本质 maven-antrun-plugin插件 Spring AI-MCP源码整理 java响应式编程基础 压测实践案例之网关 elasticseach-分页搜索 sentinel增加ip来源限流后占用服务高内存问题分析 spring-boot-actuator elasticseach-head插件安装及使用 设计模式之美学习-代码命名规范 ES-Client-api-easy es sentinel-ProcessorSlot sentinel-SPI初始化时机 记录一次内存泄漏排查 设计思路之系统做深能力的思维方式
掌握Redis集群通信,解决数据存取难题
意犹未尽 · 2026-02-24 · via 博客园 - 意犹未尽

环境

配置

spring:
  data:
    #redis配置
    redis:
      password: ****
      lettuce:
        pool:
          max-idle: 200
          min-idle: 50
          max-active: 5000
          max-wait: 1000
      timeout: 2000
      cluster: # 此处新增
        nodes: 101.4.3.191:7000,101.4.3.191:7001,101.4.3.190:7000,101.4.3.190:7001,101.4.3.189:7000,101.4.3.189:7001     # 集群地址
        max-redirects: 6 #最大重定向次数

异常场景

使用redis template 写入再读取没有数据

写入

   redisTemplate.opsForZSet()
                .add(AgenticBusRedisConstants.AGENTIC_BUS_LONG_POLLING_KEY, taskNo, nextPollingTime);

读取数量返回0

        Long size = redisTemplate.opsForZSet()
                .size(AgenticBusRedisConstants.AGENTIC_BUS_LONG_POLLING_KEY);

问题排查

使用客户端工具访问集群的key

排除是写入失败的问题

image

是否是key序列化问题

怀疑是不是底层改变了key,调试到最底层,写入和读取key是一致的

了解集群通信原理

image

选择机制代码配置参考

@Configuration
public class RedissonConfig {

    @Value("${spring.data.redis.cluster.nodes}")
    private List<String> nodes;

    @Value("${spring.data.redis.password}")
    private String password;


    @Bean
    public RedissonClient clusterRedisClient() {
        Config config = new Config();
        ClusterServersConfig clusterServersConfig = config.useClusterServers();

        if (!StringUtils.isBlank(password)) {
            clusterServersConfig.setPassword(password);
        }
        // 集群状态扫描间隔时间,单位是毫秒
        clusterServersConfig.setScanInterval(2000);
        // 关键配置:启用集群槽位全覆盖检查,确保正确处理 MOVED/ASK 重定向
        clusterServersConfig.setCheckSlotsCoverage(true);
        // 设置读取模式:MASTER - 只从主节点读取,确保数据一致性
        clusterServersConfig.setReadMode(org.redisson.config.ReadMode.MASTER);
        // 设置订阅模式:MASTER
        clusterServersConfig.setSubscriptionMode(org.redisson.config.SubscriptionMode.MASTER);

        for (String node : nodes) {
            String url = "redis://" + node;
            clusterServersConfig.addNodeAddress(url);
        }
        RedissonClient redissonClient = Redisson.create(config);

        return redissonClient;
    }


}

View Code

MOVED/ASK 重定向原理

image

image

查看当前集群状态

执行命令

image

image

 可以让AI生成可视化表格

image

 问题排查

1、通过打断点发现路由的服务为

[addr=redis://101.4.3.189:7000] 无数据 查询没有数据,未从节点

2、我将ReadModel改为主节点 则可以正常查询到数据

/**
 * @Description redisson相关配置
 * @Date 2023/9/26 10:44
 * @Author liqiang
 */
@Configuration
public class RedissonConfig {

    @Value("${spring.data.redis.cluster.nodes}")
    private List<String> nodes;

    @Value("${spring.data.redis.password}")
    private String password;


    @Bean
    public RedissonClient clusterRedisClient() {
        Config config = new Config();
        ClusterServersConfig clusterServersConfig = config.useClusterServers();

        if (!StringUtils.isBlank(password)) {
            clusterServersConfig.setPassword(password);
        }
        // 集群状态扫描间隔时间,单位是毫秒
        clusterServersConfig.setScanInterval(2000);
        // 关键配置:启用集群槽位全覆盖检查,确保正确处理 MOVED/ASK 重定向
        clusterServersConfig.setCheckSlotsCoverage(true);
        // 设置读取模式:MASTER - 只从主节点读取,确保数据一致性
        clusterServersConfig.setReadMode(org.redisson.config.ReadMode.MASTER);
        // 设置订阅模式:MASTER
        clusterServersConfig.setSubscriptionMode(org.redisson.config.SubscriptionMode.MASTER);

        for (String node : nodes) {
            String url = "redis://" + node;
            clusterServersConfig.addNodeAddress(url);
        }
        RedissonClient redissonClient = Redisson.create(config);

        return redissonClient;
    }


}

3、101.4.3.189:7000为从节点,是不是没有复制到数据 连上这台机执行

image

image

 反馈给运维处理,回复

其他命令

计算一个key的槽位

测试环境(101.4.3.191:7001)>CLUSTER KEYSLOT agentic-bus:task:long_polling:
"11299"

查看槽位分配

101.4.3.189(101.4.3.189:7000)>CLUSTER SLOTS
1) 1) "10923"
   2) "16383"
   3) 1) "101.4.3.191"
      2) "7001"
      3) "ebb6538d73bd3324cbde380ce6dc5afb83bad7c4"

   4) 1) "101.4.3.189"
      2) "7000"
      3) "4019bbab983d360c15b7f68d8afdae8a27cf6861"


2) 1) "0"
   2) "5460"
   3) 1) "101.4.3.191"
      2) "7000"
      3) "7b74ab40f4a2c0bdc615ad95ee593785d0a805a0"

   4) 1) "101.4.3.190"
      2) "7001"
      3) "ea8b427b4b0b5b21fe721b7ef9b62488e488f596"


3) 1) "5461"
   2) "10922"
   3) 1) "101.4.3.190"
      2) "7000"
      3) "ac7020869fab5a1c4e6f2789d1945a7c31ad0246"

   4) 1) "101.4.3.189"
      2) "7001"
      3) "8f9349d8fb48b809fbd065d7e9013acf59b2abe3"