You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s环境下Jedis如何实现Redis集群动态拓扑刷新?

Jedis实现Redis集群动态拓扑刷新的方案

Jedis 4.0及以上版本已经原生提供了集群拓扑自动刷新能力,无需额外定制开发,适配K8s环境下Redis节点IP变更的场景,具体配置分两种场景:

一、原生Jedis使用场景

构造JedisCluster实例时,通过ClusterTopologyRefreshOptions配置开启刷新能力即可,代码示例:

// 配置拓扑刷新规则
ClusterTopologyRefreshOptions refreshOptions = ClusterTopologyRefreshOptions.builder()
        // 开启定时刷新,间隔可自定义,此处设为5分钟
        .enablePeriodicRefresh(Duration.ofMinutes(5))
        // 开启自适应刷新,遇到MOVED/ASK重定向、未知节点等异常时自动触发刷新
        .enableAdaptiveRefreshTrigger(
                ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT,
                ClusterTopologyRefreshOptions.RefreshTrigger.ASK_REDIRECT,
                ClusterTopologyRefreshOptions.RefreshTrigger.UNKNOWN_NODE)
        // 固定用初始配置的负载均衡域名拉取拓扑,不要用集群返回的节点IP作为刷新源
        .dynamicRefreshSources(false)
        .build();

// 绑定刷新配置到集群配置
JedisClusterConfig clusterConfig = new JedisClusterConfig();
clusterConfig.setTopologyRefreshOptions(refreshOptions);

// 初始化JedisCluster,仅传入负载均衡域名即可
Set<HostAndPort> nodes = Collections.singleton(new HostAndPort("prod-redis-cluster.xyz.com", 6379));
JedisCluster jedisCluster = new JedisCluster(nodes, clusterConfig);

dynamicRefreshSources设为false是K8s场景的核心配置,可避免Jedis缓存旧的节点IP导致刷新失效。

二、Spring Data Redis集成Jedis场景

如果使用Spring Boot集成Jedis,可直接通过yaml配置实现:

spring:
  redis:
    cluster:
      nodes: prod-redis-cluster.xyz.com:6379
    timeout: 150ms
    jedis:
      cluster:
        refresh:
          # 开启自适应刷新
          adaptive: true
          # 定时刷新周期
          period: 5m
          # 关闭动态刷新源,固定用配置的域名拉取拓扑
          dynamic-refresh-sources: false

如果需要代码自定义更精细的刷新规则,可通过注入JedisClientConfiguration实现:

@Bean
public JedisClientConfiguration jedisClientConfiguration() {
    ClusterTopologyRefreshOptions refreshOptions = ClusterTopologyRefreshOptions.builder()
            .enablePeriodicRefresh(Duration.ofMinutes(5))
            .enableAdaptiveRefreshTrigger(
                    ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT,
                    ClusterTopologyRefreshOptions.RefreshTrigger.ASK_REDIRECT,
                    ClusterTopologyRefreshOptions.RefreshTrigger.UNKNOWN_NODE)
            .dynamicRefreshSources(false)
            .build();

    return JedisClientConfiguration.builder()
            .clusterTopologyRefreshOptions(refreshOptions)
            .connectTimeout(Duration.ofMillis(150))
            .build();
}

低版本Jedis兼容方案

如果使用的是Jedis 4.0以下版本,没有原生拓扑刷新能力,建议优先升级Jedis版本到4.0+;如果不能升级,可以自定义定时任务,每隔固定周期重新构造JedisCluster实例替换旧实例,替换时需要做好旧实例的连接资源释放,避免连接泄漏。

内容的提问来源于stack exchange,提问作者jagannathan rajagopalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:36:03