关于Redis配置哨兵时,默认连接池参数不生效的配置

本文详细介绍了如何在Spring Boot项目中配置和使用Redis,包括连接池设置、哨兵配置及JSON序列化处理,实现高性能的数据缓存。

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

package com.lexue.coupon.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Author: ShuYuLiu
 * @Description: 实例化redisTemplete
 * @Date: 11:19 2019/7/04
 *
 **/
@Configuration
public class RedisConfig{
    @Autowired
    RedisProperties  redisProperties;
    @Value("${spring.redis.pool.max-idle}")
    private Integer maxIdle;
    @Value("${spring.redis.pool.min-idle}")
    private Integer minIdle;
    @Value("${spring.redis.pool.max-wait}")
    private Integer  maxWait;

    @Value("${spring.redis.pool.max-active}")
    private Integer  maxActive;

    @Bean(name = "jedisPoolConfig")
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(maxIdle);
        config.setMaxTotal(maxActive);
        config.setMaxWaitMillis(maxWait);
        config.setMinIdle(minIdle);
        config.setTestOnBorrow(true);
        config.setTestWhileIdle(true);
        config.setNumTestsPerEvictionRun(2);
        config.setTimeBetweenEvictionRunsMillis(30000);
        config.setMinEvictableIdleTimeMillis(60000);
        config.setSoftMinEvictableIdleTimeMillis(60000);
        return config;
    }

    @Bean(name = "redisSentinelConfiguration")
    public RedisSentinelConfiguration getRedisSentinelConfiguration(){
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
        //配置redis的sentinel
        Set<RedisNode> redisNodeSet = new HashSet<>();
        List<String> nodes = redisProperties.getSentinel().getNodes();
        if(nodes!=null && nodes.size()>0){
            nodes.forEach(redisNode -> {
                String[] split = redisNode.split(":");
                RedisNode redisNodes = new RedisNode(split[0],Integer.parseInt(split[1]));
                redisNodeSet.add(redisNodes);
            });
        }
        redisSentinelConfiguration.setSentinels(redisNodeSet);
        redisSentinelConfiguration.setMaster(redisProperties.getSentinel().getMaster());
        return redisSentinelConfiguration;

    }

    @Bean(name = "jedisConnectionFactory")
    public JedisConnectionFactory  redisConnectionFactory(@Qualifier("redisSentinelConfiguration")RedisSentinelConfiguration redisSentinelConfiguration,
                                                         @Qualifier("jedisPoolConfig")JedisPoolConfig  jedisPoolConfig){
        JedisConnectionFactory jedisConnectionFactory=new JedisConnectionFactory(redisSentinelConfiguration,jedisPoolConfig);
        jedisConnectionFactory.setDatabase(redisProperties.getDatabase());
        jedisConnectionFactory.setHostName(redisProperties.getHost());
        jedisConnectionFactory.setPort(redisProperties.getPort());
        jedisConnectionFactory.setPassword(redisProperties.getPassword());
        jedisConnectionFactory.setTimeout(0);
        jedisConnectionFactory.setUsePool(true);
        return jedisConnectionFactory;
    }


    @Bean
    public RedisTemplate<String, Object> redisTemplate(@Qualifier("jedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory)
    {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper om = new ObjectMapper();
        jackson2JsonRedisSerializer.setObjectMapper(om);
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(jedisConnectionFactory);
        template.setKeySerializer(jackson2JsonRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}
<think>好的,用户想在Spring Boot中整合Redis哨兵模式。我需要先回顾一下相关的知识,确保步骤正确。首先,记得Redis哨兵模式是用来实现高可用性的,当主节点故障哨兵会自动选举新的主节点。 首先,用户需要添加Redis的依赖。Spring Boot通常使用spring-boot-starter-data-redis,这个依赖包含了Lettuce和Jedis客户端。不过现在默认是Lettuce,如果需要用Jedis的话,可能需要排除Lettuce并引入Jedis的依赖。这点需要确认,但用户的问题可能不需要具体到客户端选择,所以先提基本的依赖。 接下来是配置文件。在application.yml或application.properties中配置Redis哨兵的相关信息。关键的配置项包括哨兵节点的地址、主节点的名称,以及可能的密码和数据库编号。例如,spring.redis.sentinel.master设置主节点名称,spring.redis.sentinel.nodes列出所有哨兵的地址和端口。 然后,可能需要配置Redis连接工厂,比如使用JedisConnectionFactory或者LettuceConnectionFactory,具体取决于使用的客户端。不过Spring Boot可能已经自动配置了这些,用户只需要正确设置属性即可。如果用户需要自定义配置,比如连接池参数,这候可能需要手动创建配置类。 另外,用户可能需要了解如何测试哨兵配置是否生效。例如,可以编写一个测试用例,尝试连接Redis并执行一些操作,然后模拟主节点故障,看看应用是否能自动切换到新的主节点。不过这可能超出基础整合的范围,属于进阶内容。 还要考虑密码的情况。如果Redis设置了密码,需要在配置中添加spring.redis.password属性。同哨兵本身可能有独立的密码,这候可能需要额外的配置,比如在spring.redis.sentinel.password中设置。这点需要根据Redis的版本和Spring Boot的支持情况来确认,不同版本可能有不同的配置方式。 用户可能还关心如何验证配置是否正确。可以启动应用,查看日志是否有连接哨兵的记录,或者通过健康检查端点/actuator/health查看Redis的状态。另外,使用RedisTemplate进行操作,如果能够成功读写,说明配置正确。 另外,记得在配置哨兵节点,每个节点的格式是host:port,多个节点用逗号分隔。例如,spring.redis.sentinel.nodes=sentinel1:26379,sentinel2:26380,sentinel3:26381。 最后,可能还需要提示用户关于版本兼容性的问题,不同版本的Spring Boot对Redis的支持可能有差异,建议查看官方文档或者参考引用的教程视频,比如提到的雷丰阳的课程,确保配置方法与当前使用的Spring Boot版本兼容。 总结步骤应该是:添加依赖→配置哨兵信息→测试连接。过程中要注意配置项的正确性,以及可能需要的客户端选择。如果有高级需求,比如连接池设置或异常处理,可能需要进一步配置。</think>以下是在Spring Boot中整合Redis哨兵模式的实现步骤: ### 1. 添加依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 推荐使用Spring Boot 2.7.x及以上版本,支持更完善的哨兵配置[^2]。 ### 2. 配置哨兵信息 ```yaml spring: redis: password: your-redis-password sentinel: master: mymaster # 主节点名称 nodes: - sentinel1:26379 - sentinel2:26380 - sentinel3:26381 password: sentinel-password # 哨兵服务密码(可选) ``` ### 3. 配置连接工厂 ```java @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory( RedisSentinelConfiguration sentinelConfig) { return new JedisConnectionFactory(sentinelConfig); } } ``` ### 4. 使用RedisTemplate ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void setValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); } ``` ### 关键特性说明: 1. **自动故障转移**:当主节点不可用哨兵会自动选举新主节点 2. **读写分离**:通过`@ReadOnly`注解实现只读操作路由到从节点 3. **拓扑刷新**:默认每10秒自动更新节点状态信息[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值