Spring Boot/Spring应用中配置自定义RedisTemplate

发布于:2025-06-08 ⋅ 阅读:(25) ⋅ 点赞:(0)
@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        //template.setValueSerializer(stringRedisSerializer);
        // hash的value序列化方式采用jackson
       // template.setHashValueSerializer(stringRedisSerializer);//(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

自定义RedisTemplate与默认RedisTemplate配置比较

下面我将比较自定义的RedisTemplate配置与Spring Boot默认提供的RedisTemplate配置之间的主要区别:

1. 序列化方式

默认RedisTemplate配置

  • Key序列化:使用JdkSerializationRedisSerializer
    • 生成二进制key,不可读(如:\xac\xed\x00\x05t\x00\x03key
  • Value序列化:同样使用JdkSerializationRedisSerializer
    • Java对象被序列化为二进制格式
    • 占用空间相对较大
    • 不同语言客户端无法读取

自定义RedisTemplate配置

  • Key序列化:使用StringRedisSerializer
    • 生成可读的字符串key(如:"user:1001"
    • 便于调试和管理
  • Value序列化:配置了Jackson2JsonRedisSerializer(虽然被注释)
    • 将对象序列化为JSON格式
    • 可读性强
    • 占用空间相对较小
    • 其他语言客户端可以读取

2. 类型处理能力

默认配置

  • 使用JDK序列化可以保留完整的类型信息
  • 但仅限于Java客户端使用

自定义配置

  • 使用Jackson序列化并启用enableDefaultTyping
    • 在JSON中嵌入类型信息(@class字段)
    • 可以反序列化为原始类型
    • 但有潜在的安全风险(反序列化漏洞)

3. 实际存储效果示例

默认配置存储对象

key: \xac\xed\x00\x05t\x00\x04user
value: \xac\xed\x00\x05sr\x00\x0com.example.User...

自定义配置存储对象

key: "user:1001"
value: {"@class":"com.example.User","id":1001,"name":"张三"...}

4. 优缺点对比

特性 默认配置 自定义配置
可读性 差(二进制) 好(可读字符串和JSON)
跨语言支持 仅Java 支持任何JSON解析器
存储效率 一般(JDK序列化体积较大) 较好(JSON相对紧凑)
类型安全 中(enableDefaultTyping有风险)
调试便利性
兼容性 只适用于Java应用 多语言环境友好

5. 关键差异总结

  1. Key的可读性:自定义配置使用字符串序列化,极大提升了key的可读性和管理便利性

  2. Value的格式:自定义配置倾向于使用JSON而非Java原生序列化,更适合现代应用开发

  3. 互操作性:自定义配置使Redis数据可以被非Java客户端读取和修改

  4. 安全考虑:默认配置更安全,自定义配置的enableDefaultTyping可能带来反序列化风险

  5. 灵活性:自定义配置可以更灵活地处理复杂对象结构

6. 使用建议

  • 使用自定义配置当:

    • 需要可读的Redis key
    • 需要与其他语言服务共享Redis数据
    • 需要直接通过Redis CLI查看和调试数据
  • 使用默认配置当:

    • 仅Java应用使用Redis
    • 对安全性要求极高
    • 不需要人工查看Redis中的数据

实际开发中,大多数项目会选择类似这里的自定义配置,但会进一步优化安全性和性能。


网站公告

今日签到

点亮在社区的每一天
去签到