Spring Boot集成Redis后重启首次请求耗时久问题咨询
Redis缓存重启后首次请求仍慢的原因分析
1. 缓存值反序列化耗时过高
Redis中存储的是二进制数据,应用重启后第一次读取缓存时,需要将这些二进制数据反序列化为业务代码中的Java对象。如果你的对象结构复杂、数据量较大,默认的JDK序列化/反序列化效率极低,这个过程会消耗大量时间,且该操作是在Spring缓存拦截器中完成的,不会进入被@Cacheable注解标记的业务方法,所以会出现日志显示未进入方法但请求耗时久的情况。
解决办法是替换为Jackson序列化,修改你的RedisCacheConfiguration:
public RedisCacheConfiguration cacheConfiguration() { return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(defaultTtl)) .disableCachingNullValues() // 键用字符串序列化 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 值用Jackson JSON序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); }
2. Redis连接池懒加载导致的连接建立延迟
应用重启后,Redis连接池默认是懒加载模式——只有第一次请求时才会创建Redis连接,这个过程包含网络握手、权限认证等步骤,会产生额外耗时。即便Redis中已有缓存数据,连接建立的耗时叠加反序列化耗时,也会导致首次请求变慢。
可以通过配置连接池初始化参数,让应用启动时就创建一批连接:
spring: redis: lettuce: pool: initial-size: 5 # 启动时初始化的连接数 max-active: 10 max-idle: 10 min-idle: 5
3. 缓存元数据首次加载开销
应用重启后,Spring缓存框架需要初始化缓存相关的元数据(比如缓存名称与Redis键前缀的映射、缓存管理器的内部状态),这些初始化操作会在第一次缓存访问时执行,也会带来一定的耗时,不过通常这个开销远小于前两者,但可能和其他因素叠加导致总耗时增加。
内容的提问来源于stack exchange,提问作者arohiman
相关产品推荐
相关产品推荐

