java对象存redis应禁用jdk序列化,优先用jackson json序列化(配genericjackson2jsonredisserializer+javatimemodule),key用stringredisserializer,hash field/value也统一字符串;高频场景可选protobuf。

Java 中对象存到 Redis,关键不是“能不能序列化”,而是“用什么方式序列化 + 怎么配 RedisTemplate 才不出错”。直接用默认 JDK 序列化会带来体积大、跨语言难、反序列化漏洞等实际风险,必须主动替换。
优先选 Jackson JSON 序列化(最稳妥)
把对象转成标准 JSON 字符串,Redis 存的是 String 类型,调试时直接 GET user:1001 就能看清内容,前端、运维、DBA 都能看懂。
- 配置 Jackson2JsonRedisSerializer 或 GenericJackson2JsonRedisSerializer,后者对泛型支持更好,避免反序列化时类型丢失
- ObjectMapper 加上常用配置:启用 WRITE_DATES_AS_TIMESTAMPS = false 防止时间变成长整型;注册 JavaTimeModule 支持 LocalDateTime 等新时间类型
- key 必须用 StringRedisSerializer,value 用 JSON;hash 的 field 也统一用字符串,别混用 byte[] 和 String,否则 HGET 会报错
高频稳定场景可选 Protobuf(更小更快)
适合单日缓存调用量超千万、结构长期不变的对象,比如用户画像快照、订单摘要。实测比 JSON 小 30%~40%,序列化速度快 2 倍以上。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 需提前定义 .proto 文件,生成 Java 类,再封装自定义 RedisSerializer
- 不能人工查数据——二进制不可读,也不适合前端直读或运营后台展示
- 别每次 new Parser,应复用实例;建议配合 Schema 版本号字段,方便未来升级兼容
务必禁用 JDK 原生序列化
Redis 里看到 \xAC\xED\x00\x05 开头的 value,基本就是 JDK 序列化残留。它把类名、包路径、字段签名全打进去,一旦改类名、删字段、升级 JDK,所有缓存立即失效;更严重的是,可能被利用触发远程代码执行。
- Spring Boot 2.6+ 已默认关闭 enableDefaultTyping,但老项目遗留风险仍高
- 上线前必须清理掉 JdkSerializationRedisSerializer,不要图省事保留
- 如有老数据需兼容,写一次性迁移脚本转成 JSON,别长期混合使用
RedisTemplate 配置要全覆盖
只设 setValueSerializer 是不够的,漏配其他序列化器会导致操作失败或乱码。
- setKeySerializer:key 必须是 StringRedisSerializer
- setValueSerializer:value 主体,按需选 Jackson 或 Protobuf
- setHashKeySerializer 和 setHashValueSerializer:操作 Hash 时分别控制 field 和 value 的序列化方式
- setListSerializer、setSetSerializer 等也要明确指定,尤其存集合类对象时
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










