默认redistemplate用jdkserializationredisserializer将字符串包装为带魔数的二进制流,导致redis-cli显示\xac\xed\x00\x05等乱码;必须显式配置stringredisserializer(utf-8)或jackson2jsonredisserializer,并同步设置key/value及hash相关序列化器。

Spring Boot 集成 Redis 出现乱码,90% 是因为 RedisTemplate 的 key 和 value 序列化器没配对或配错类型。
为什么默认的 RedisTemplate 一存中文就变 \xac\xed\x00\x05t\x00-
它用的是 JdkSerializationRedisSerializer,把字符串包装成 String 对象再序列化成二进制流。Redis 里存的不是纯文本,而是带魔数(\xac\xed)和类型头的 Java 私有格式。redis-cli 或可视化工具直接读字节,当然显示乱码。
- 现象:redis-cli 执行
get user:name返回一堆不可见字符或十六进制 - 本质:序列化器和反序列化器不一致,或你用字符串方式去解析二进制流
- 关键点:
StringRedisTemplate默认用StringRedisSerializer,天然 UTF-8 友好;但RedisTemplate不会自动继承这个行为
setKeySerializer 和 setValueSerializer 必须同时设,且类型要匹配
只设 key 不设 value,或者反过来,都会导致部分字段乱码。尤其注意:哈希结构(HASH)还要额外配 setHashKeySerializer 和 setHashValueSerializer,漏掉一个就可能查不到值。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 纯字符串场景(如缓存 JSON 字符串):统一用
StringRedisSerializer - 对象存储场景(如
User实体):key 仍用StringRedisSerializer,value 改用Jackson2JsonRedisSerializer - 别踩坑:
GenericJackson2JsonRedisSerializer会给字符串加@class字段,导致 key 显示为{"@class":"java.lang.String","value":"xxx"}
Spring Boot 3 下 StringRedisSerializer 要显式指定 UTF-8 编码
虽然 StringRedisSerializer 默认走 UTF-8,但在某些 JVM 启动环境(如 Windows CMD 默认 GBK、IDE 控制台编码不一致)下,System.out.println() 输出仍可能乱码。这不是 Redis 存错了,而是终端解码错了。
- 确保 JVM 启动参数包含
-Dfile.encoding=UTF-8 - 在配置 Bean 时可显式传参:
new StringRedisSerializer(StandardCharsets.UTF_8) - 验证方式:用 redis-cli 查看 key 是否可读,而不是只信控制台输出
真正容易被忽略的是——RedisTemplate 和 StringRedisTemplate 的序列化器完全不兼容。用前者存的 key,后者根本 get 不到;反之亦然。跨模块协作或迁移旧代码时,这点必须人工对齐,没有自动 fallback。










