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。
    • 固定类型 → Jackson2Json 或 Fastjson。
    • 高性能 → Kryo 或 Protobuf。
    • 跨语言兼容 → Protobuf 或 JSON 序列化器。
  3. XML/YAML 需求 :
    • XML → OxmSerializer(需配置驱动)。
    • YAML → SnakeYAMLSerializer。
  4. 自定义需求 :
    • 特定协议 → 实现 RedisSerializer。
    • 极端性能 → Protobuf 或 Kryo。

配置示例

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());

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

相关推荐
hweiyu0034 分钟前
Redis命令:SUNIONSTORE
redis·缓存
麻瓜code1 小时前
秒杀优化三连:Lua + 阻塞队列 + Redis Stream,响应从 3.4 秒到毫秒级
redis·junit·lua
没有气的汽水5 小时前
一次生产 Redis 内存打满的排查、清理和复盘
redis
hey you~5 小时前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
我不会起名字3227 小时前
Redis pipeline 用了反而更慢:3 类误用与正确的批量姿势
redis·pipeline·lua·rtt·批量
Tsuki_tl7 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
代码丰1 天前
大 JSON 放进 Redis 之后,如何用 Stream 解耦耗时任务?
redis·后端·系统架构
枫子有风1 天前
卡码网盘项目深挖
java·redis·jwt·es·pgvector
福大大架构师每日一题1 天前
redis 8.10.3正式发布:聚焦集群总线超大消息传播场景的安全修复,8.10.3 Latest更新解读
数据库·redis·安全
江屿风1 天前
【Plain Language Large Model】【从麦当劳点餐到Redis接入:MCP如何让AI工具集成变简单】流食般投喂
人工智能·redis·笔记·语言模型·llm·mcp