Spring Boot 兼容Redis、Redisson单机和哨兵模式

文章介绍了如何基于SpringBoot根据application.yml中的配置,自动适配Redis的单机和哨兵模式,涉及RedisTemplate和LettuceConnectionFactory的处理以及Redisson的配置示例。

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

一:需求背景

根据application.yml里面的内容,java代码自动实现单机和哨兵模式的兼容

比如如果是下面这种配置,则实现单机配置:

spring:
  redis:
    cluster:
      nodes: 127.0.0.1:6379
    password: "xxxx"
    timeout: 6000
    database: 0
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:6379

比如如果是下面这种配置,则实现哨兵配置:

spring 
 redis:
    cluster:
      nodes: 127.0.0.1:8881,127.0.0.1:8882,127.0.0.1:8883
    password: "xxxx"
    timeout: 6000
    database: 0
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:18881,127.0.0.1:18882,127.0.0.1:18883

二:Redis代码

 
@Configuration
public class RedisConfiguration {

    @Value("${spring.redis.sentinel.nodes}")
    private String cluster;

    @Bean
    @Primary
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }


    @Bean
    public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
        String[] hostAndPorts = cluster.split(",");

        if (hostAndPorts.length == 1) {

            String host = hostAndPorts[0].split(":")[0];
            int port = Integer.valueOf(hostAndPorts[0].split(":")[1]);

            JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
            RedisStandaloneConfiguration rsc = connectionFactory.getStandaloneConfiguration();
            rsc.setHostName(host);
            rsc.setPort(port);

            return connectionFactory;
        } else {
            // 配置哨兵节点以及主节点
            RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(
                    redisProperties.getSentinel().getMaster(), new HashSet<>(redisProperties.getSentinel().getNodes())
            );

            LettucePoolingClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
                    .readFrom(ReadFrom.REPLICA_PREFERRED)
                    .build();

            return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
        }

    }


}

三:Redisson代码

 
@Configuration
@Component
public class RedissionConfig {

    @Value("${spring.redis.sentinel.master}")
    private  String master;

    @Value("${spring.redis.sentinel.nodes}")
    private  String cluster;

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

    @Value("${spring.redis.timeout}")
    private Integer timeout;

    @Bean
    public Redisson redisson() {
        String[] hostAndPorts = cluster.split(",");

        Config config = new Config();

        if(hostAndPorts.length==1){
            String host = hostAndPorts[0].split(":")[0];
            int port = Integer.valueOf(hostAndPorts[0].split(":")[1]);
            config.setCodec(new JsonJacksonCodec());
            config.useSingleServer().
                    setAddress("redis://" + host + ":" + port);
        }else {

            List<String> clusterNodes = new ArrayList<>();
            for (int i = 0; i < hostAndPorts.length; i++) {
                clusterNodes.add("redis://" + hostAndPorts[i]);
            }

            SentinelServersConfig serverConfig = config.useSentinelServers()
                    .addSentinelAddress(clusterNodes.toArray(new String[0]))
                    .setMasterName(master)
                    .setReadMode(ReadMode.SLAVE)
                    .setTimeout(timeout);

            //设置密码
            if (StringUtils.isNotBlank(password)) {
                serverConfig.setPassword(password);
            }
        }

        return (Redisson) Redisson.create(config);
    }

}



<think>嗯,用户问Redisson是否支持单机模式。首先,我需要确认Redisson的文档或者官方资料里有没有提到单机模式的支持。记得Redisson是一个Redis的客户端,主要用于Java应用,所以它应该支持不同的部署模式,包括单机、集群、哨兵等。 接下来,我应该回想一下单机模式的具体配置方法。用户可能需要知道如何配置单机模式,所以需要给出示例代码或者配置步骤。比如,通过Config类创建单机配置,设置地址端口,然后创建RedissonClient实例。 另外,用户可能对单机模式的一些高级配置感兴趣,比如连接池设置、超时时间、重试策略等。这些参数可以帮助优化性能稳定性,应该简要提及。 还需要考虑用户的使用场景。单机模式适用于开发测试环境或者小规模应用,而生产环境可能需要集群或者哨兵模式。但用户明确问的是单机模式,所以重点放在单机的支持上,但可能也需要稍微提到其他模式,以供参考。 另外,检查是否有版本限制。Redisson的不同版本是否在单机模式上有差异?一般来说,单机模式是基础功能,应该所有版本都支持,但可能需要确认最新文档是否有变化。 可能用户在使用过程中遇到了问题,或者在选择Redis客户端时考虑Redisson的功能。需要明确回答支持,并给出足够的信息帮助用户开始使用,比如代码示例配置项。 最后,确保语言简洁明了,用中文回答,结构清晰,分点说明支持配置方法,可能的高级选项,以及适用场景。避免使用过于专业的术语,但必要时解释清楚,比如连接池、超时设置等。</think>Redisson **支持单机模式**,它是 Redisson 提供的多种部署模式中最基础且常用的一种。以下是关于单机模式的详细介绍使用方法: --- ### **1. 单机模式的核心配置** 在 Redisson 中,单机模式通过简单的配置即可连接到单个 Redis 服务器实例。典型的配置示例如下: ```java Config config = new Config(); // 配置单节点模式 config.useSingleServer() .setAddress("redis://127.0.0.1:6379") // Redis 地址(默认端口 6379) .setPassword("your_password") // 密码(若无密码可省略) .setDatabase(0); // 数据库编号(默认 0) // 创建 Redisson 客户端实例 RedissonClient redisson = Redisson.create(config); ``` --- ### **2. 单机模式的高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值