Spring Boot 集成 Redis 乱码问题详解:原因分析与解决方案
在 Spring Boot 集成 Redis 时,若使用默认配置的 RedisTemplate 操作字符串,常出现 key/value 乱码(如前缀含 \xac\xed\x00\x05t\x00\x03 等特殊字符)。核心原因是 RedisTemplate 默认采用 JdkSerializationRedisSerializer 序列化方式(基于 JDK 原生序列化,会生成二进制数据),而 StringRedisTemplate 或自定义序列化配置可彻底解决该问题。从 “乱码原因→两种解决方案→序列化对比→实战示例” 四个维度,系统讲解 Redis 乱码的解决方法。
乱码的根本原因:默认序列化方式不匹配
首先需明确:Redis 本身是 二进制安全的键值存储,不限制数据格式,但 Spring Boot 提供的 RedisTemplate 默认序列化方式会导致 “人类不可读” 的二进制数据,被误认为 “乱码”。
1. RedisTemplate 默认序列化配置
RedisTemplate 对不同类型的序列化器默认配置如下:
| 数据类型 |
默认序列化器 |
序列化结果特点 |
| Key(键) |
JdkSerializationRedisSerializer |
生成二进制数据,前缀含特殊字符(如 \xac\xed),乱码 |
| Value(值) |
JdkSerializationRedisSerializer |
同上,二进制数据,不可读 |
| Hash Key |
JdkSerializationRedisSerializer |
同上 |
| Hash Value |
JdkSerializationRedisSerializer |
同上 |
问题根源:JdkSerializationRedisSerializer 的特性
- 原理:基于 JDK
ObjectOutputStream 实现序列化,要求被序列化的对象实现 Serializable 接口;
- 结果:序列化后的数据是 二进制字节数组,存储到 Redis 后显示为乱码(如
\xac\xed\x00\x05t\x00\x03key);
- 场景不匹配:若仅操作字符串(如
String 类型的 key/value),二进制序列化完全没必要,且导致乱码。
2. 示例:默认配置的乱码效果
使用默认 RedisTemplate 存储字符串: