spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)

RedisTemplate 序列化器详细对比(官方及非官方)


1. 官方序列化器
(1) JdkSerializationRedisSerializer
  • 特点
    • 基于 Java 原生序列化(Serializable)。
    • 支持复杂对象(需实现 Serializable 接口)。
    • 缺点:体积大、反序列化需类文件、跨语言支持差、性能较低。
  • 适用场景:简单对象且对性能要求不高。
(2) StringRedisSerializer
  • 特点
    • 仅支持 String 类型,直接转换 byte[]
    • 无额外开销,性能最优。
  • 适用场景:键值均为字符串的场景。
(3) GenericJackson2JsonRedisSerializer
  • 特点
    • 基于 Jackson,自动添加 @class 字段保留类型信息。
    • 支持复杂对象,无需显式指定类型。
  • 适用场景:需要自动处理类型信息的复杂对象。
(4) Jackson2JsonRedisSerializer
  • 特点
    • 基于 Jackson,需显式指定对象类型(如 User.class)。
    • 性能高于 GenericJackson2Json
  • 适用场景:已知对象类型或单类型场景。
(5) OxmSerializer(如 Jaxb2/XStream)
  • 特点
    • 支持 XML 序列化(如 JAXB、XStream)。
    • 需配置 XML 驱动(如 Jaxb2CollectionSerializer)。
    • 适用场景:需 XML 格式存储或与 XML 系统交互。
(6) RedisObjectSerializer(自定义二进制)
  • 特点
    • Redis 原生二进制序列化(如 RedisSerializer 接口实现)。
    • 通常用于特定场景(如与 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 需人类可读配置文件

总结与建议

  1. 简单键值对 :首选 StringRedisSerializer(性能最优)。
  2. 复杂对象
    • 自动类型处理GenericJackson2Json
    • 固定类型Jackson2JsonFastjson
    • 高性能KryoProtobuf
    • 跨语言兼容Protobuf 或 JSON 序列化器。
  3. XML/YAML 需求
    • XML → OxmSerializer(需配置驱动)。
    • YAML → SnakeYAMLSerializer
  4. 自定义需求
    • 特定协议 → 实现 RedisSerializer
    • 极端性能 → ProtobufKryo

配置示例

JSON 序列化(Jackson)
java 复制代码
@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)
java 复制代码
// 需自定义实现
public class KryoRedisSerializer implements RedisSerializer<Object> {
    private final Kryo kryo = new Kryo();

    @Override
    public byte[] serialize(Object object) {
        Output output = new Output(new ByteArrayOutputStream());
        kryo.writeClassAndObject(output, object);
        return output.toBytes();
    }

    @Override
    public Object deserialize(byte[] bytes) {
        Input input = new Input(bytes);
        return kryo.readClassAndObject(input);
    }
}
Protobuf 配置
java 复制代码
// 需定义.proto文件并生成Java类
template.setValueSerializer(new ProtobufSerializer());

根据项目需求选择序列化器,平衡性能、兼容性和开发成本!

相关推荐
Kagol3 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
hzulwy4 小时前
Redis常用的数据结构及其使用场景
数据库·redis
ashane13145 小时前
Redis 哨兵集群(Sentinel)与 Cluster 集群对比
redis
Y第五个季节6 小时前
Redis - HyperLogLog
数据库·redis·缓存
Justice link7 小时前
企业级NoSql数据库Redis集群
数据库·redis·缓存
爱的叹息10 小时前
Spring Boot 集成Redis 的Lua脚本详解
spring boot·redis·lua
morris13118 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
weitinting20 小时前
Ali linux 通过yum安装redis
linux·redis
纪元A梦21 小时前
Redis最佳实践——首页推荐与商品列表缓存详解
数据库·redis·缓存