必须序列化,因为Redis只处理字节数组或字符串,不理解Java对象类型;序列化将对象转为Redis可存格式,反序列化则还原对象。

Java 对象不能直接存进 Redis,因为 Redis 只认字符串、字节数组这类基础类型。所以必须先把对象转成可存储的格式——这个过程叫序列化;读取时再还原回去,叫反序列化。
为什么必须序列化?
Redis 服务端不理解 Java 类型,它只处理 byte[] 或字符串。如果你用默认 RedisTemplate 存一个 User 对象,底层会用 JDK 自带的序列化器,结果 key 和 value 都是乱码(比如 sr com.example.User...),不仅人看不懂,其他语言服务也读不了。
常用序列化方式对比
主流有三类,按推荐度排序:
- JSON 方式(最常用):把对象转成 JSON 字符串,存为普通 string 类型。优点是可读性强、跨语言兼容好、调试方便;缺点是性能略低于二进制,且不支持复杂类型(如含循环引用、非 public 字段需加注解)。
-
JDK 原生序列化:实现
Serializable接口后直接序列化为 byte[]。简单但有严重缺陷:版本升级易出错、不兼容其他语言、体积大、存在安全风险(反序列化漏洞)。 - FastJSON2 / Jackson / Gson:比原生更高效,JSON 格式,支持泛型、日期格式控制等。FastJSON2 是阿里开源的新一代,性能和安全性优于旧版 FastJSON。
Spring Boot 中推荐做法(JSON + StringRedisTemplate)
不用改全局配置,轻量可控:
立即学习“Java免费学习笔记(深入)”;
- 用
StringRedisTemplate操作字符串类型的 key-value - 手动用
ObjectMapper(Jackson)或JSON.toJSONString()(FastJSON2)序列化对象为字符串 - 存的时候调
stringRedisTemplate.opsForValue().set("user:1001", jsonStr) - 取的时候用
stringRedisTemplate.opsForValue().get("user:1001")得到字符串,再反序列化回对象
示例(FastJSON2):
User user = new User(1001, "张三", 28);
String json = JSON.toJSONString(user);
stringRedisTemplate.opsForValue().set("user:1001", json);
// 读取
String jsonFromRedis = stringRedisTemplate.opsForValue().get("user:1001");
User cachedUser = JSON.parseObject(jsonFromRedis, User.class);
进阶:统一配置 RedisTemplate 支持 JSON 序列化
如果项目中大量操作对象,建议自定义 RedisTemplate<String, Object>,指定 JSON 序列化器:
- key 保持 String 类型(用
StringRedisSerializer) - value 使用
GenericJackson2JsonRedisSerializer(支持泛型、空值处理、时间格式) - 避免手动序列化/反序列化,直接
redisTemplate.opsForValue().set("user:1001", user) - 注意:实体类字段需有 getter/setter,时间字段建议用
@JsonFormat注解规范格式


















