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中的数据

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

相关推荐
Flynt3 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
码哥字节3 小时前
AI一天出百本书,写不出我被Redis坑的那三天三夜
redis·ai编程工具
Tangyuewei4 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
yxlalm6 小时前
5.3解决超卖问题
java·spring boot·超卖
名字还没想好☜7 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
边境悍匪7 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
xcl09259 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet9 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly76899 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
行百里er11 小时前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
spring boot·spring cloud·监控