Spring Boot 使用lettuce 集成多Redis

吐槽

Spring boot 2.1.5集成多redis过程中,也遇到和很多坑,如:

  1. 数据源不能进行切换
  2. 部署之后找不到配置的redis,只去找localhost:6379.
  3. 不能获取到数据,报错 json不能序列化等。
    还好最终成功了,以下是我成功部署之后的代码,希望能给部分人解答问题。

版本介绍

Spring boot : 2.1.5

application.yml

spring:
  redis:
    host: r-**.redis.rds.aliyuncs.com
    port: 6379
    password: **
    database: 0
    timeout: 2000
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 8000
    redis38a4:
      host: r-**.redis.rds.aliyuncs.com
      port: 6379
      password: **
      database: 0

RedisConfig.java

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate redisTemplate38a4( @Value("${spring.redis.database}") int database,
                                            @Value("${spring.redis.timeout}") long timeout,
                                            @Value("${spring.redis.lettuce.pool.max-active}") int maxActive,
                                            @Value("${spring.redis.lettuce.pool.max-wait}") int maxWait,
                                            @Value("${spring.redis.lettuce.pool.max-idle}") int maxIdle,
                                            @Value("${spring.redis.lettuce.pool.min-idle}") int minIdle,
                                            @Value("${spring.redis.redis38a4.host}") String hostName,
                                            @Value("${spring.redis.redis38a4.port}") int port,
                                            @Value("${spring.redis.redis38a4.password}") String password){
        /* ========= 基本配置 ========= */
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(hostName);
        configuration.setPort(port);
        configuration.setDatabase(database);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }

        /* ========= 连接池通用配置 ========= */
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxTotal(maxActive);
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMaxWaitMillis(maxWait);

        /* ========= jedis pool ========= */
        /*
        JedisClientConfiguration.DefaultJedisClientConfigurationBuilder builder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration
                .builder();
        builder.connectTimeout(Duration.ofSeconds(timeout));
        builder.usePooling();
        builder.poolConfig(genericObjectPoolConfig);
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(configuration, builder.build());
        // 连接池初始化
        connectionFactory.afterPropertiesSet();
        */

        /* ========= lettuce pool ========= */
        LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
        builder.poolConfig(genericObjectPoolConfig);
        builder.commandTimeout(Duration.ofSeconds(timeout));
        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
        connectionFactory.afterPropertiesSet();

        /* ========= 创建 template ========= */
        return createRedisTemplate(connectionFactory);

    }
    /**
     * 默认配置(8944) redis template
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate8944(RedisConnectionFactory redisConnectionFactory) {
        return createRedisTemplate(redisConnectionFactory);
    }
    /**
     * json 实现 redisTemplate
     * <p>
     * 该方法不能加 @Bean 否则不管如何调用,connectionFactory都会是默认配置
     *
     * @param redisConnectionFactory
     * @return
     */
    public RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
//        GenericJackson2JsonRedisSerializer redisSerializer = new GenericJackson2JsonRedisSerializer();
//
//        redisTemplate.setDefaultSerializer(redisSerializer);


//        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//
//        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

调用

 @Autowired
@Qualifier("redisTemplate8944")
private RedisTemplate redisTemplate8944;
@Autowired
@Qualifier("redisTemplate38a4")
private RedisTemplate redisTemplate38a4;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot使用Lettuce连接Redis时,可以通过以下方式检查连接的有效性: 1. 使用LettuceConnectionFactory创建连接工厂对象,并设置连接池配置; 2. 使用RedisTemplate创建Redis操作模板对象,并设置连接工厂对象; 3. 使用RedisTemplate的execute方法执行ping命令,如果返回结果为PONG,则连接有效。 示例代码如下: ``` @Configuration public class RedisConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName("localhost"); config.setPort(6379); config.setPassword(RedisPassword.of("password")); LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .useSsl().and() .commandTimeout(Duration.ofSeconds(2)) .shutdownTimeout(Duration.ZERO) .build(); return new LettuceConnectionFactory(config, clientConfig); } @Bean(name = "redisTemplate") public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } @Component public class RedisHealthIndicator implements HealthIndicator { @Autowired private RedisTemplate<String, Object> redisTemplate; @Override public Health health() { try { String pong = (String) redisTemplate.execute((RedisCallback<String>) connection -> connection.ping()); if ("PONG".equals(pong)) { return Health.up().build(); } return Health.down().withDetail("error", "ping command failed").build(); } catch (Exception e) { return Health.down(e).build(); } } } ``` 在以上示例中,RedisHealthIndicator类实现了Spring Boot的HealthIndicator接口,用于检查Redis连接的健康状态。在health方法中,通过RedisTemplate的execute方法执行ping命令,如果返回结果为PONG,则连接有效。Health对象的状态和详情信息可以在Spring Boot的actuator端点中查看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值