默认的 redistemplate 不能用,因其默认使用 jdkserializationredisserializer,将数据序列化为不可读二进制(如\xac\xed\x00\x05),导致 redis cli 查不到真实值、调试困难、跨语言调用失败。

默认的 RedisTemplate 用 JDK 序列化,存进去全是不可读二进制,查 Redis CLI 看不到值,调试困难,跨语言调用也断掉——必须立刻换掉。
为什么不能用默认的 RedisTemplate 序列化
Spring Boot 自动装配的 RedisTemplate 默认使用 JdkSerializationRedisSerializer,导致所有 value 存成类似 aced00057372... 的十六进制乱码。这带来三个实际问题:
- Redis CLI 或可视化工具(如 Another Redis Desktop Manager)里完全看不到真实数据,排查缓存命中/失效极其低效
- 序列化/反序列化性能差,尤其对复杂对象,比 JSON 慢 3–5 倍
- Java 外的服务(如 Node.js、Python)无法直接消费这些二进制数据,限制了多语言协作场景
如何配置 Jackson 序列化的 RedisTemplate
手动定义 RedisTemplate Bean,把 key 固定为字符串,value 用 Jackson2JsonRedisSerializer,并配好 ObjectMapper 支持泛型和 private 字段:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<string object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<string object> template = new RedisTemplate();
template.setConnectionFactory(factory);
StringRedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
Jackson2JsonRedisSerializer<object> jsonSerializer =
new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
LazyValidatorPolyForDefaultTyping.instance(),
ObjectMapper.DefaultTyping.NON_FINAL);
jsonSerializer.setObjectMapper(om);
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);
template.afterPropertiesSet();
return template;
}
}</object></string></string>
注意两点:
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
-
activateDefaultTyping必须启用,否则反序列化时会报Cannot construct instance of java.lang.Object - 不要用
GenericJackson2JsonRedisSerializer,它在 Spring Boot 3.x 中已弃用,且不支持泛型擦除后的类型还原
@Cacheable 注解怎么配合 Redis 一起用
想用 @Cacheable 走 Redis,光有 spring-boot-starter-data-redis 不够,还得显式引入 spring-boot-starter-cache 并开启缓存支持:
- 加依赖:
spring-boot-starter-cache(Spring Boot 3.3+ 默认不带,必须显式声明) - 在主类或配置类上加
@EnableCaching - application.yml 中指定缓存类型:
spring.cache.type=redis - 缓存名需对应
CacheManager中定义的 cache,否则@Cacheable(cacheNames = "user")会找不到目标
如果发现注解没生效,先检查 CacheManager 是否被正确替换为 RedisCacheManager —— Spring Boot 3.x 默认用的是 SimpleCacheManager,不是 Redis。
连接池参数调优容易被忽略的细节
Lettuce 是 Spring Boot 3.x 默认客户端,但它的连接池配置不像 Jedis 那样直观。几个关键点:
-
max-active不是“最大并发连接数”,而是连接池中允许创建的最大连接总数;设太高(比如 1000)反而触发 Redis 连接数限制,建议从 32 开始压测调整 -
min-idle设为 0 是安全的,Lettuce 的连接是惰性创建,空闲连接不会长期维持 -
max-wait单位是毫秒,但配置项写成500ms会被解析失败,必须写500(纯数字)或500ms加引号:"500ms" - 超时要分层:Redis 连接超时(
timeout)、命令执行超时(command-timeout)、连接池获取超时(max-wait),三者缺一不可
真正影响缓存效率的,往往不是序列化或注解,而是连接池在高并发下拿不到连接、命令超时重试、或者反序列化失败后静默吞异常——这些都得靠日志 + 实际压测才能暴露出来。










