SpringBoot集成Redis-解决序列化问题

JDK17 + SpringBoot 3.2.2

  1. 引入依赖
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 添加配置
@Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
        ObjectMapper objectMapper = new ObjectMapper();
        // 处理Date类型
        objectMapper.setDateFormat(new SimpleDateFormat(DATE_TIME_FORMAT));
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        objectMapper.registerModule(new JavaTimeModule()
                // 处理LocalDateTime类型
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)))
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))));
        // 序列化java对象时,将类的信息写入redis
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
        // 修改默认的序列化规则
        redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
        return redisTemplate;
    }
Spring BootRedis集成时,序列化方式的配置是关键的一部分,因为它决定了数据在Redis中如何存储和读取。默认情况下,`RedisTemplate`使用`JdkSerializationRedisSerializer`进行序列化,但这通常不适合跨语言的场景,因为它生成的是二进制数据。因此,通常会根据需求更换为更通用的序列化方式,如`StringRedisSerializer`或`GenericJackson2JsonRedisSerializer`。 ### 配置键和值的序列化方式 可以通过自定义 `RedisTemplate` 的 Bean 来设置键和值的序列化器。以下是一个典型的配置示例: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` 上述配置中,`StringRedisSerializer`用于序列化键(key),而`GenericJackson2JsonRedisSerializer`用于序列化值(value)[^2]。这种方式可以确保键以字符串形式存储,值以JSON格式存储,便于调试和跨语言交互。 ### 使用 `StringRedisSerializer` 的优势 当使用 `StringRedisSerializer` 时,键将直接以字符串形式存储,避免了不必要的编码问题,特别是在处理字符串类型的键时非常有用[^1]。如果未配置该序列化器,默认的 `JdkSerializationRedisSerializer` 会将键序列化为二进制格式,这在调试时不够友好。 ### 使用 `GenericJackson2JsonRedisSerializer` `GenericJackson2JsonRedisSerializer` 是 Spring 提供的一个 JSON 序列化器,它使用 Jackson 将对象转换为 JSON 字符串进行存储,并在反序列化时恢复为原始对象。这种方式适用于复杂对象的存储,并且保证了数据的可读性[^3]。 ### 配置连接池和超时时间 除了序列化配置外,还可以在 `application.yml` 中配置 Redis 连接池和超时时间,以优化性能: ```yaml spring: redis: host: 127.0.0.1 port: 6379 timeout: 10s lettuce: pool: min-idle: 0 max-idle: 8 max-active: 8 max-wait: -1ms ``` 该配置定义了 Redis 连接的基本参数,包括地址、端口、超时时间以及连接池的相关设置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值