redistemplate 默认使用 jdk 序列化导致 key/value 在外部工具中不可读,应分别配置 keyserializer、valueserializer、hashkeyserializer 和 hashvalueserializer 为 stringredisserializer 和 genericjackson2jsonredisserializer,以实现可读性与类型安全;旧数据需单独迁移。

RedisTemplate 默认用 JDK 序列化,存进去的 key 和 value 会带 \xac\xed\x00\x05t\x00 这类前缀,不是真乱码,而是 Java 对象流的协议头。它在代码里读写没问题,但用 redis-cli、RedisInsight 或其他图形化工具查看时,完全不可读,调试和运维都困难。
关键:明确序列化器分工
RedisTemplate 有多个序列化器,不能只设一个就完事:
- keySerializer:控制所有操作中 key 的序列化(如 set、get、del 的 key)
- valueSerializer:控制普通 value(如 String 类型 value)的序列化
-
hashKeySerializer:专门用于 Hash 结构里的 field 名(比如
HSET user:1 name "张三"中的name) -
hashValueSerializer:专门用于 Hash 结构里的 field 值(如上面的
"张三") - defaultSerializer:仅当没单独设置上述某一项时才兜底使用,不建议依赖它
推荐配置:String + JSON 组合
多数业务场景下,key 一定是字符串,应统一用 StringRedisSerializer;value 可能是对象,适合用 JSON 序列化,兼顾可读性与类型还原能力:
- key、hashKey →
StringRedisSerializer(UTF-8 编码,无前缀,纯文本) - value、hashValue →
GenericJackson2JsonRedisSerializer(比 Jackson2JsonRedisSerializer 更健壮,支持泛型和空值)
注意:不要用 GenericJackson2JsonRedisSerializer 处理 key,否则字符串 key 会被包成 {"@class":"java.lang.String","value":"user:1"},反而更难读。
配置示例(Spring Boot 3.x + Lettuce)
新建 @Configuration 类,显式设置全部四项:
@Bean
public RedisTemplate<string object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<string object> template = new RedisTemplate();
template.setConnectionFactory(factory);
// 字符串序列化器(UTF-8)
RedisSerializer<string> stringSerializer = RedisSerializer.string();
// JSON 序列化器(推荐 GenericJackson2JsonRedisSerializer)
RedisSerializer<object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setValueSerializer(jsonSerializer);
template.setHashKeySerializer(stringSerializer);
template.setHashValueSerializer(jsonSerializer);
return template;
}</object></string></string></string>
旧数据迁移要小心
改了配置后,新数据干净了,但历史数据仍是 JDK 序列化格式。如果业务需要读旧数据:
- 临时加一个
@Bean(name = "legacyRedisTemplate"),用JdkSerializationRedisSerializer读取老 key/value - 读出后转成新格式,再用新 template 写回,完成“刷库”
- 不建议长期混用两种序列化方式,容易引发反序列化异常或类型误判
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











