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

java 复制代码
@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中的数据

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

相关推荐
007php0075 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
长安城没有风5 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
珹洺7 小时前
Java-Spring入门指南(二十七)Android Studio 第一个项目搭建与手机页面模拟器运行
java·spring·android studio
laopeng3017 小时前
基于Spring AI Deep Researcher Agent
java·人工智能·spring
Q_Q5110082858 小时前
python+uniapp基于微信小程序团购系统
spring boot·python·微信小程序·django·uni-app·node.js·php
m0_736927048 小时前
Spring Boot自动配置与“约定大于配置“机制详解
java·开发语言·后端·spring
爬山算法9 小时前
Redis(69)Redis分布式锁的优点和缺点是什么?
数据库·redis·分布式
重生之我在二本学院拿offer当牌打9 小时前
手写SpringBoot Starter(一):10分钟带你入门,从此告别重复配置!
spring boot
初见0019 小时前
🌱 SpringBoot自动配置:别装了,我知道你的秘密!🤫
spring boot·后端
lang201509289 小时前
Spring Boot核心功能深度解析
spring boot