如何为业务场景选择合适的Redis缓存序列化器?
如何为业务场景选择合适的Redis序列化器
背景说明
在Spring生态中使用Redis缓存时,RedisCacheManager和RedisTemplate的默认序列化策略存在明显差异:
RedisCacheManager默认键序列化器为StringRedisSerializer,值序列化器为JdkSerializationRedisSerializerRedisTemplate默认键、值序列化器均为JdkSerializationRedisSerializer,同时支持哈希键与哈希值的单独序列化配置
需要注意的是,尽管Redis原生支持哈希功能,但Spring缓存抽象并不适配哈希及键值序列化器的相关配置。
常见Redis序列化器实现
Spring提供的Redis序列化器主要有以下几种:
GenericJackson2JsonRedisSerializerJdkSerializationRedisSerializerStringRedisSerializerJackson2JsonRedisSerializerByteArrayRedisSerializerGenericToStringSerializerOxmSerializer
各序列化器特性与适用场景
1. StringRedisSerializer
- 特性:仅支持字符串类型的序列化/反序列化,轻量且性能最优
- 适用场景:缓存值为字符串的场景(如配置项、简单文本),或Redis键的序列化(所有场景下键都建议使用该序列化器,保证可读性)
- 局限:无法直接序列化Java对象
2. JdkSerializationRedisSerializer
- 特性:基于JDK原生序列化机制,支持所有实现
Serializable接口的Java对象,序列化结果为二进制字节流 - 适用场景:需要缓存复杂Java对象、且不要求Redis存储内容可读的场景;或需序列化Jackson难以处理的对象(如带复杂内部状态的自定义类)
- 局限:序列化结果不可读、占用空间大,存在序列化漏洞风险,跨语言兼容性差
3. Jackson2JsonRedisSerializer
- 特性:基于Jackson实现JSON序列化,支持自定义
ObjectMapper,可灵活配置序列化规则(如忽略空字段、指定日期格式),序列化结果为可读的JSON字符串 - 适用场景:需要缓存Java对象且要求Redis存储内容可读的场景;需对JSON序列化做精细化配置的业务(如统一日期处理、字段过滤)
- 局限:使用时需明确指定目标类类型,无法自动处理多态类型的反序列化
4. GenericJackson2JsonRedisSerializer
- 特性:基于Jackson实现,会在JSON中自动添加
@class字段记录对象类型,支持多态对象的反序列化,无需手动指定目标类 - 适用场景:需要缓存多态类型对象的场景(如父类引用指向不同子类实例),且希望简化配置的场景
- 局限:序列化后的JSON会多一个类型字段,占用少量额外空间;自定义
ObjectMapper的灵活性略低于Jackson2JsonRedisSerializer
5. ByteArrayRedisSerializer
- 特性:直接对字节数组进行透传,不做任何序列化处理
- 适用场景:缓存内容本身为字节数组的场景(如图片、文件的二进制数据)
- 局限:仅适用于字节数组类型,通用性差
6. GenericToStringSerializer
- 特性:可将任意对象转换为字符串,默认使用
toString()方法,也支持自定义转换逻辑 - 适用场景:需要将非字符串对象转为可读字符串存储,但无需反序列化回原对象的场景(如缓存对象标识信息、日志内容)
- 局限:默认
toString()结果难以反序列化,若需反序列化需自定义转换逻辑
7. OxmSerializer
- 特性:基于Spring O/X Mapping实现XML序列化/反序列化,支持对象与XML互相转换
- 适用场景:业务依赖XML格式数据交互,需要缓存XML格式内容的场景
- 局限:XML序列化占用空间大、性能低于JSON,当前业务中使用较少
选择建议
- 键序列化器优先选
StringRedisSerializer:无论什么业务场景,Redis键都建议使用该序列化器,保证键的可读性与兼容性 - 值序列化器根据需求匹配:
- 字符串/简单文本:
StringRedisSerializer - Java对象需可读、跨语言:优先
Jackson2JsonRedisSerializer(需精细化配置)或GenericJackson2JsonRedisSerializer(多态场景) - Java对象无需可读、仅限Java生态使用:
JdkSerializationRedisSerializer - 二进制数据:
ByteArrayRedisSerializer - 需转为字符串但无需反序列化:
GenericToStringSerializer - XML格式场景:
OxmSerializer
- 字符串/简单文本:
内容的提问来源于stack exchange,提问作者Sankalpa Wijewickrama
相关产品推荐
相关产品推荐

