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());
根據項目需求選擇序列化器,平衡性能、兼容性和開發成本!