当前位置: 首页 > news >正文

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键值均为字符串
GenericJackson2JsonJSON(泛型)复杂对象Jackson需自动处理类型信息的复杂对象
Jackson2JsonJSON(单类型)固定对象类型Jackson已知对象类型或单类型场景
OxmSerializer(Jaxb2)XML 序列化支持 XML 对象需配置JAXB/XStream需 XML 格式存储
RedisObjectSerializer自定义二进制任意自定义实现特定协议交互或高性能需求
FastjsonRedisSerializerJSON(Fastjson)复杂对象需显式指定Fastjson高性能 JSON 需求
GsonRedisSerializerJSON(Gson)复杂对象需显式指定Gson轻量级 JSON 需求
KryoSerializer二进制(Kryo)复杂对象极高Kryo性能优先且类型固定
ProtobufSerializer二进制(Protobuf)复杂对象是(需定义)极高Protobuf跨语言系统或高性能需求
SnakeYAMLSerializerYAML复杂对象是(YAML格式)SnakeYAML需人类可读配置文件

总结与建议

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

配置示例

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

    @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 配置
// 需定义.proto文件并生成Java类
template.setValueSerializer(new ProtobufSerializer());

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

http://www.dtcms.com/a/107019.html

相关文章:

  • 谷粒微服务高级篇学习笔记整理---thymeleaf
  • Kafka、RocketMQ、Pulsar对比
  • Linux 文件系统超详解
  • Java中的LocalDate类
  • 关于登录鉴权session、cookie和token
  • KMstation商品库存监控下单
  • neo4j+django+deepseek知识图谱学习系统对接前后端分离前端vue
  • angular实现连连看
  • 蓝桥杯练习:二叉树的最大深度
  • 系统与网络安全------Windows系统安全(6)
  • niuhe插件, 在 go 中渲染网页内容
  • 基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)
  • 删除和关闭 Solana 中的账户和程序
  • Linux网络相关概念和重要知识(4)(序列化和反序列化、TCP协议、会话和守护进程)
  • 基于OpenCV的指纹验证:从原理到实战的深度解析
  • vue3 动态路由
  • 第1章-3 MySQL的逻辑架构
  • 【C++】二叉搜索树
  • 【哈希表】—— 我与C++的不解之缘(二十八)
  • [CISSP] [4] 法律、法规
  • alfred-deepseek开源程序在 Alfred 中与 DeepSeek 聊天
  • [IOI 2000] 回文字串
  • 符号秩检验
  • 跟着尚硅谷学vue-day2
  • 23 种设计模式中的解释器模式
  • C++友元与动态内存
  • 关于存储的笔记
  • go语言:开发一个最简单的用户登录界面
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day3
  • 【数据结构】树、森林与二叉树的转换(含详细图解)