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

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

相关推荐
win x10 小时前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
我是大猴子11 小时前
Spring代理类为何依赖注入失效?
java·后端·spring
Java成神之路-13 小时前
通俗易懂理解 Spring MVC 拦截器:概念、流程与简单实现(Spring系列16)
java·spring·mvc
递归尽头是星辰13 小时前
Spring Boot 配置排除失效深度解析:时序与机制核心
spring boot·自动配置·bean 加载·exclude失效·组件扫描
程序员萌萌14 小时前
Redis的缓存机制和淘汰策略详解
数据库·redis·缓存机制·淘汰策略
小锋java123414 小时前
SpringBoot 4 + Spring Security 7 + Vue3 前后端分离项目设计最佳实践
java·vue.js·spring boot
一 乐14 小时前
校园线上招聘|基于springboot + vue校园线上招聘系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园线上招聘系统
不懂的浪漫14 小时前
mqtt-plus 架构解析(四):MqttMessageInterceptor 的扩展点设计
java·spring boot·物联网·mqtt
小旭952715 小时前
Spring Security 实现权限控制(认证 + 授权全流程)
java·后端·spring
宠友信息15 小时前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app