RedisTemplate 序列化器详细对比(官方及非官方)
1. 官方序列化器
(1) JdkSerializationRedisSerializer
- 特点: - 基于 Java 原生序列化(Serializable)。
- 支持复杂对象(需实现 Serializable接口)。
- 缺点:体积大、反序列化需类文件、跨语言支持差、性能较低。
 
- 基于 Java 原生序列化(
- 适用场景:简单对象且对性能要求不高。
(2) StringRedisSerializer
- 特点: - 仅支持 String类型,直接转换byte[]。
- 无额外开销,性能最优。
 
- 仅支持 
- 适用场景:键值均为字符串的场景。
(3) GenericJackson2JsonRedisSerializer
- 特点: - 基于 Jackson,自动添加 @class字段保留类型信息。
- 支持复杂对象,无需显式指定类型。
 
- 基于 Jackson,自动添加 
- 适用场景:需要自动处理类型信息的复杂对象。
(4) Jackson2JsonRedisSerializer
- 特点: - 基于 Jackson,需显式指定对象类型(如 User.class)。
- 性能高于 GenericJackson2Json。
 
- 基于 Jackson,需显式指定对象类型(如 
- 适用场景:已知对象类型或单类型场景。
(5) OxmSerializer(如 Jaxb2/XStream)
- 特点: - 支持 XML 序列化(如 JAXB、XStream)。
- 需配置 XML 驱动(如 Jaxb2CollectionSerializer)。
- 适用场景:需 XML 格式存储或与 XML 系统交互。
 
(6) RedisObjectSerializer(自定义二进制)
- 特点: - Redis 原生二进制序列化(如 RedisSerializer接口实现)。
- 通常用于特定场景(如与 Redis 协议直接交互)。
- 需自定义实现,灵活性高但复杂。
 
- Redis 原生二进制序列化(如 
2. 非官方序列化器
(1) FastjsonRedisSerializer
- 特点: - 基于阿里巴巴 Fastjson,性能优于 Jackson。
- 支持复杂对象,需显式指定类型。
- 依赖 Fastjson 库。
 
- 适用场景:追求高性能 JSON 序列化。
(2) GsonRedisSerializer(需自定义)
- 特点: - 基于 Google Gson 库,轻量级 JSON 序列化。
- 需手动实现 RedisSerializer接口。
- 灵活性高,适合熟悉 Gson 的项目。
 
- 适用场景:已有 Gson 依赖或偏好轻量级 JSON。
(3) KryoSerializer(需第三方库)
- 特点: - 基于 Kryo 库,二进制序列化,性能极高。
- 不保留类型信息,需手动处理类型。
- 跨语言支持差,但体积小、速度快。
 
- 适用场景:对性能要求极高且类型固定。
(4) ProtobufSerializer(需自定义)
- 特点: - 基于 Protocol Buffers(Protobuf),二进制序列化。
- 高性能、体积小,跨语言兼容性好。
- 需定义 .proto 文件,配置复杂度较高。
 
- 适用场景:跨语言系统或对性能要求极高的场景。
(5) SnakeYAMLSerializer(需自定义)
- 特点: - 基于 SnakeYAML 库,支持 YAML 格式序列化。
- 适合需要人类可读配置文件的场景。
- 依赖 SnakeYAML 库。
 
- 适用场景:需 YAML 格式存储(如配置类)。
对比表格
| 序列化器 | 类型 | 支持对象类型 | 保留类型信息 | 性能 | 依赖 | 适用场景 | 
|---|---|---|---|---|---|---|
| JdkSerialization | 原生序列化 | 复杂对象 | 是 | 低 | 无 | 简单对象,对性能要求不高 | 
| StringRedisSerializer | 字符串序列化 | 仅 String | 否 | 高 | 无 | 键值均为字符串 | 
| GenericJackson2Json | JSON(泛型) | 复杂对象 | 是 | 中 | Jackson | 需自动处理类型信息的复杂对象 | 
| Jackson2Json | JSON(单类型) | 固定对象类型 | 否 | 高 | Jackson | 已知对象类型或单类型场景 | 
| OxmSerializer(Jaxb2) | XML 序列化 | 支持 XML 对象 | 需配置 | 低 | JAXB/XStream | 需 XML 格式存储 | 
| RedisObjectSerializer | 自定义二进制 | 任意 | 否 | 高 | 自定义实现 | 特定协议交互或高性能需求 | 
| FastjsonRedisSerializer | JSON(Fastjson) | 复杂对象 | 需显式指定 | 高 | Fastjson | 高性能 JSON 需求 | 
| GsonRedisSerializer | JSON(Gson) | 复杂对象 | 需显式指定 | 中 | Gson | 轻量级 JSON 需求 | 
| KryoSerializer | 二进制(Kryo) | 复杂对象 | 否 | 极高 | Kryo | 性能优先且类型固定 | 
| ProtobufSerializer | 二进制(Protobuf) | 复杂对象 | 是(需定义) | 极高 | Protobuf | 跨语言系统或高性能需求 | 
| SnakeYAMLSerializer | YAML | 复杂对象 | 是(YAML格式) | 中 | SnakeYAML | 需人类可读配置文件 | 
总结与建议
- 简单键值对:首选 StringRedisSerializer(性能最优)。
- 复杂对象: - 自动类型处理 → GenericJackson2Json。
- 固定类型 → Jackson2Json或Fastjson。
- 高性能 → Kryo或Protobuf。
- 跨语言兼容 → Protobuf或 JSON 序列化器。
 
- 自动类型处理 → 
- XML/YAML 需求: - XML → OxmSerializer(需配置驱动)。
- YAML → SnakeYAMLSerializer。
 
- XML → 
- 自定义需求: - 特定协议 → 实现 RedisSerializer。
- 极端性能 → Protobuf或Kryo。
 
- 特定协议 → 实现 
配置示例
JSON 序列化(Jackson)
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;
}
高性能二进制(Kryo)
// 需自定义实现
public class KryoRedisSerializer implements RedisSerializer<Object> {private final Kryo kryo = new Kryo();@Overridepublic byte[] serialize(Object object) {Output output = new Output(new ByteArrayOutputStream());kryo.writeClassAndObject(output, object);return output.toBytes();}@Overridepublic Object deserialize(byte[] bytes) {Input input = new Input(bytes);return kryo.readClassAndObject(input);}
}
Protobuf 配置
// 需定义.proto文件并生成Java类
template.setValueSerializer(new ProtobufSerializer());
根据项目需求选择序列化器,平衡性能、兼容性和开发成本!