推荐使用json序列化替代java原生序列化存储对象到redis,因其可读性强、跨语言兼容、升级稳定;配置redistemplate和rediscachemanager均采用genericjackson2jsonredisserializer,并注意实体类的循环引用、无参构造、敏感字段忽略等序列化友好性要求。

直接用Java原生序列化存复杂对象到Redis,虽然可行但不推荐——数据不可读、跨语言不兼容、升级易出错。真正实用的方式是把对象转成JSON字符串再存,既直观又健壮。
为什么不用默认JDK序列化
Spring Data Redis默认用JDK自带的JdkSerializationRedisSerializer,它会把对象序列化成二进制字节数组。结果在Redis里看到的是乱码(如aced00057372…),调试困难;而且一旦类结构变动(比如加字段、改包名),反序列化就失败,抛InvalidClassException。
推荐方案:统一用JSON序列化
核心思路是让所有缓存值都走Jackson,转成标准JSON字符串存储。这样Redis里看到的就是明文,比如{"id":101,"name":"张三","dept":"技术部"},可读、可查、可调试,也方便后续被其他语言服务消费。
- 配置
RedisTemplate时,设置valueSerializer为GenericJackson2JsonRedisSerializer或Jackson2JsonRedisSerializer - 实体类无需实现
Serializable接口(JSON序列化不依赖它) - 建议开启
ObjectMapper的WRITE_DATES_AS_TIMESTAMPS = false,避免日期变成毫秒数字 - 若实体含泛型或继承关系,用
GenericJackson2JsonRedisSerializer更稳妥
配合Spring Cache注解使用
启用@EnableCaching后,@Cacheable等注解底层也走RedisCacheManager。需同步配置它的序列化规则:
- 调用
serializeValuesWith(...)指定值序列化器为GenericJackson2JsonRedisSerializer - 键(key)仍用
StringRedisSerializer,保证key是纯字符串,便于人工操作和监控 - 可统一设TTL(如1天)、禁用null值缓存,避免脏数据
注意实体类的序列化友好性
不是所有Java对象都能无脑转JSON。以下几点要提前检查:
- 移除循环引用字段(如父子双向关联),否则Jackson会栈溢出;可用
@JsonIgnore或@JsonBackReference - Lombok的
@Data或@AllArgsConstructor通常够用,但确保有无参构造方法(Jackson反序列化必需) - 敏感字段(如密码)加
@JsonIgnore,避免意外泄露 - 枚举类型默认转名称(如
"ACTIVE"),若需转数值,配置ObjectMapper的WRITE_ENUMS_USING_TO_STRING
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











