SpringBoot响应式RedisClient配置

大多数场景,默认配置的Redis客户端不满足业务场景,根源在于Redis key、value 序列化反序列化问题。因此,有必要配置自定义的客户端来满足需求。

默认配置源码如下,采用jdk序列化/反序列化方式进行,我们只需要配置相同的bean org.springframework.data.redis.core.ReactiveRedisTemplate即可覆盖默认:

1.引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>2.6.13</version>
</dependency>

2.配置文件配置(Redis基于sentinel搭建)

多个节点之间逗号分隔

spring:
  redis:
    password: your password
    timeout: 6000
    database: 1
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381
      password: your password
    lettuce:
      pool:
        max-active: 10
        max-idle: 3
        max-wait: -1
        min-idle: 1

3.配置Java Config

@Bean
public ReactiveRedisTemplate<Object, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
    // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
    // 解决查询缓存转换异常的问题
    Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper objectMapper = new ObjectMapper();

    // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
    objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    objectMapper.setTimeZone(TimeZone.getDefault());
    objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE);

    // 解决序列化/反序列化 LocalDateTime 问题
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.registerModule(new JavaTimeModule());

    // 确定遇到未知属性(未映射到属性,并且没有“任何setter”或处理程序可以处理它)是否会导致失败(通过抛出JsonMappingException)的功能。
    // 此设置仅在尝试了未知属性的所有其他处理方法后生效,并且属性保持未处理状态
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    serializer.setObjectMapper(objectMapper);

    RedisSerializationContext<Object, Object> serializationContext = RedisSerializationContext.newSerializationContext()
            .key(serializer)
            .hashKey(serializer)
            .value(serializer)
            .hashValue(serializer)
            .build();
    return new ReactiveRedisTemplate<>(factory, serializationContext);
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流沙QS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值