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());
根据项目需求选择序列化器,平衡性能、兼容性和开发成本!