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

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

相关推荐
独行侠影a2 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
paopaokaka_luck6 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
不在逃避q7 小时前
Golang笔记之Redis
redis·笔记·golang
江晓鱼未暖11 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
红莲凪是11 小时前
Redis有哪些部署方案?了解哨兵机制吗?
java·redis·eureka
小罗水11 小时前
第13章 Redis 缓存、幂等锁与任务状态
数据库·redis·缓存
热心市民lcj11 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
zzzll111112 小时前
Spring Cloud 微服务:从入门到实践
spring·spring cloud·微服务
天丁o12 小时前
Spring Boot + MyBatis Plus 考勤日报统计报表:打卡记录聚合、异常分类和明细下钻 Demo
spring boot·mybatis plus·企业数字化·考勤系统·报表统计
智_永无止境12 小时前
Spring Boot 集成 OnlyOffice
java·spring boot·后端