spring boot下JedisCluster方式连接Redis集群的配置

本文介绍如何在Spring Boot项目中整合Redis集群,包括配置文件、自定义配置类、使用JedisCluster连接集群以及提供Redis帮助类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在使用springboot做项目,使用redis做缓存。在外网开发的时候redis服务器没有使用集群配置,所有就是用了RedisTemplate的方式进行连接redis服务器。但是项目代码挪到内网开发以后,内网redis服务器使用了集群的配置方式。所以原来的配置文件和帮助类 都完全不能使用了,所以最近对redis集群的配置进行了简单的研究。

1.首先是引入配置文件

      

gradle方式的配置文件
compile 'redis.clients:jedis:2.9.0'

2.application.yml的配置

spring:
  application:
    name: xxxx
  session:
    store-type: redis
  redis:
    password: xxxxx
    clusterNodes: 10.186.123.xx:7380,10.186.123.xx:7381,10.186.123.xx:7382,10.186.123.xx:7383,10.186.123.xx:7384,10.186.123.xx:7385
    expireSeconds: 120
    commandTimeout: 10000  #redis操作的超时时间
    pool:
     maxActive: 5000 #最大连接数
     maxIdle: 30 #最大空闲连接数
     minIdle: 5 #最小空闲连接数
     maxWait: 3000  #获取连接最大等待时间 ms  #default -1

3.新增类RedisProperties

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

    private int    expireSeconds;
    private String clusterNodes;
    private String password;
    private int    commandTimeout;
}

4.JedisCluster方式连接集群的配置

@Configuration
public class JedisClusterConfig {

    @Autowired
    private RedisProperties redisProperties;

    /**
     * 注意:
     * 这里返回的JedisCluster是单例的,并且可以直接注入到其他类中去使用
     * @return
     */
    @Bean
    public JedisCluster getJedisCluster() {
        String[] serverArray = redisProperties.getClusterNodes().split(",");//获取服务器数组(这里要相信自己的输入,所以没有考虑空指针问题)
        Set<HostAndPort> nodes = new HashSet<>();

        for (String ipPort : serverArray) {
            String[] ipPortPair = ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim())));
        }

        return new JedisCluster(nodes,redisProperties.getCommandTimeout(),1000,1,redisProperties.getPassword() ,new GenericObjectPoolConfig());//需要密码连接的创建对象方式
    }

}

5.redis帮助类

import com.alibaba.fastjson.JSON;
import com.cpic.fms.configer.RedisProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import redis.clients.jedis.JedisCluster;

@Component
public class RedisUtil {
    private static final Logger LOGGER    = LoggerFactory.getLogger(RedisUtil.class);

    @Autowired
    private JedisCluster  jedisCluster;

    /**
     * 设置缓存
     * @param key    缓存key
     * @param value  缓存value
     */
    public void set(String key, String value) {
        jedisCluster.set(key, value);
        LOGGER.debug("RedisUtil:set cache key={},value={}", key, value);
    }

    /**
     * 设置缓存对象
     * @param key    缓存key
     * @param obj  缓存value
     */
    public <T> void setObject(String key, T obj , int expireTime) {
        jedisCluster.setex(key, expireTime, JSON.toJSONString(obj));
    }

    /**
     * 获取指定key的缓存
     * @param key---JSON.parseObject(value, User.class);
     */
    public String getObject(String key) {
        return jedisCluster.get(key);
    }

    /**
     * 判断当前key值 是否存在
     *
     * @param key
     */
    public boolean hasKey(String key) {
        return jedisCluster.exists(key);
    }


    /**
     * 设置缓存,并且自己指定过期时间
     * @param key
     * @param value
     * @param expireTime 过期时间
     */
    public void setWithExpireTime( String key, String value, int expireTime) {
        jedisCluster.setex(key, expireTime, value);
        LOGGER.debug("RedisUtil:setWithExpireTime cache key={},value={},expireTime={}", key, value, expireTime);
    }


    /**
     * 获取指定key的缓存
     * @param key
     */
    public String get(String key) {
        String value = jedisCluster.get(key);
        LOGGER.debug("RedisUtil:get cache key={},value={}",key, value);
        return value;
    }

    /**
     * 删除指定key的缓存
     * @param key
     */
    public void delete(String key) {
        jedisCluster.del(key);
        LOGGER.debug("RedisUtil:delete cache key={}", key);
    }

}

6.帮助类的使用方式

 @Autowired
    private RedisUtil redisUtil;

  

 

 

   

<think>好的,用户想了解Spring Boot与Sentinel结合使用时如何配置Redis集群。我需要结合之前的引用资料来回答这个问题。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的配置示例。 引用[2]和[3]提到Redis的哨兵模式配置,里面涉及到了spring.redis.sentinel.master和nodes的设置。虽然用户问的是Sentinel和Redis集群配置,但Sentinel本身是用于监控主从节点的,而Redis集群是另一种模式。不过可能用户有混淆,需要明确区分。 用户提到的“Sentinel结合Redis集群”可能是指使用Sentinel来管理Redis集群的高可用性,但Redis集群本身有内置的高可用机制,不需要Sentinel。这时候可能需要确认用户的需求是否正确。不过根据用户的问题,他们可能是在寻找如何在Spring Boot中同时配置Sentinel和Redis集群模式? 不过根据引用资料,引用[2]和[3]分别展示了哨兵模式和集群模式的配置。例如,引用[3]中的集群配置是使用spring.data.redis.cluster.nodes,而哨兵模式则是使用spring.data.redis.sentinel.nodes。这说明在Spring Boot中,哨兵和集群是两种不同的配置方式,不能混用。 用户可能误解了Sentinel和Redis集群的关系,需要解释清楚。Sentinel用于主从架构下的故障转移,而Redis Cluster是分布式解决方案,分片存储数据。所以正确的配置应该是根据使用的Redis模式选择相应的配置。 现在,用户的问题是希望将Spring Boot与Sentinel结合使用,同时配置Redis集群。这可能是一个误区,因为Redis集群本身不需要Sentinel。所以需要指出这一点,并分别提供哨兵模式和集群模式的配置方法,或者解释如何正确使用。 另外,引用[5]提到了Sa-Token与Redis的集成,但可能和用户的问题无关。引用[4]是关于密码配置的问题,可能在配置时需要设置密码。 总结用户的问题,正确的回答应该包括: 1. 明确区分Redis哨兵模式和集群模式的不同配置。 2. 提供在Spring Boot配置Redis集群的示例。 3. 说明Sentinel在Redis主从架构中的角色,而集群模式不需要Sentinel。 4. 可能用户需要的是如何配置Redis集群,或者如何将Sentinel与其他组件结合使用。 因此,回答中需要指出用户可能的混淆,并分别给出集群配置和哨兵配置的示例,同时说明它们的适用场景。这样用户可以根据实际需求选择正确的配置方式。</think>在Spring Boot中集成Redis集群并与Sentinel结合使用时,需要特别注意两者的定位差异:**Redis集群用于分布式数据存储**,而**Sentinel用于主从架构的高可用监控**。以下是两种场景的配置指南及最佳实践: --- ### 一、Redis集群模式配置(原生分片方案) 当使用Redis Cluster时,直接通过集群节点配置实现数据分片,无需Sentinel介入。以下是Spring Boot配置示例: ```yaml spring: redis: cluster: nodes: 192.168.1.101:7001,192.168.1.102:7002,192.168.1.103:7003 password: your_cluster_password max-redirects: 3 # 最大重定向次数 ``` - **原理**:Redis Cluster通过分片(16384个槽)实现数据分布式存储,客户端直连节点自动路由请求[^3] - **验证配置有效性**: ```java @Autowired private RedisConnectionFactory connectionFactory; @Test void testClusterConnection() { RedisClusterConnection clusterConn = connectionFactory.getClusterConnection(); clusterConn.clusterGetClusterInfo(); // 应返回集群状态信息 } ``` --- ### 二、哨兵模式配置(主从高可用方案) 若使用主从架构+Sentinel监控,需通过哨兵节点发现主节点: ```yaml spring: redis: sentinel: master: mymaster # 与sentinel.conf配置一致 nodes: 192.168.1.201:26379,192.168.1.202:26379 password: your_sentinel_password password: your_redis_password # 主从节点密码 ``` - **工作原理**:Sentinel节点监控主从状态,发生故障时自动选举新主节点[^2] - **Redisson集成示例**(增强高可用管理): ```java @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSentinelServers() .addSentinelAddress("redis://192.168.1.201:26379", "redis://192.168.1.202:26379") .setMasterName("mymaster") .setPassword("your_redis_password"); return Redisson.create(config); } ``` --- ### 三、特殊场景:集群与哨兵联合使用 虽然技术上可行,但实际**不建议同时使用两种模式**。若必须实现: 1. 为每个Redis集群节点配置哨兵监控 2. 通过自定义路由策略集成两种客户端 ```java @Primary @Bean(name = "clusterTemplate") public RedisTemplate<String, Object> clusterTemplate() { // 初始化集群连接 } @Bean(name = "sentinelTemplate") public RedisTemplate<String, Object> sentinelTemplate() { // 初始化哨兵连接 } ``` ⚠️ 注意:这种方案会显著增加系统复杂度,建议优先选择单一数据架构方案[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值