讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Spring Boot中快速排查Redis慢查询引起的请求堆积?

阿浩君_7575

阿浩君_7575

发布时间:2026-11-02 07:46:48

|

153人浏览过

|

来源于php中文网

原创

“Read timed out”本质是Lettuce共享连接阻塞与连接池耗尽,而非Redis服务端慢;慢查询仅触发问题,真正卡住的是客户端连接排队和线程等待。

如何在spring boot中快速排查redis慢查询引起的请求堆积?

“Read timed out”不是Redis慢,而是请求在客户端排队——慢查询只是导火索,真正卡住的是Lettuce共享连接+连接池耗尽。

为什么Redis慢查询会导致Spring Boot线程堆积

Redis本身是单线程,一个慢命令(如HGETALL、KEYS、SCAN无游标)会阻塞整个实例的后续命令;而Lettuce默认使用共享连接(StatefulRedisConnection),所有请求共用同一个连接。一旦某条命令执行超时或卡住,后续发往该连接的所有execute()调用都会排队等待,最终表现为线程在GenericObjectPool.borrowObject()或Future.get()处WAITING,而不是CPU飙升或Redis报错。

  • 堆栈里出现io.lettuce.core.RedisCommandTimeoutException,但Redis服务端slowlog get查不到记录 → 很可能是客户端连接池已满,新请求根本没发出去
  • 监控发现lettuce.pool.active持续等于max-active,且lettuce.pool.idle长期为0 → 连接被占满且未释放,大概率有连接泄漏或慢命令拖住连接
  • 应用QPS没涨,但HTTP线程数持续上升 → 说明业务线程在等Redis响应,不是下游接口拖慢,而是Redis链路内部堵死

如何用AOP精准定位哪类Redis操作在拖慢系统

别依赖redis-cli --latency,它测的是PING往返,和你代码里opsForHash().entries()的真实耗时差十倍。必须在Spring Boot进程内拦截RedisTemplate.execute(),按命令类型分段计时:

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • 只拦execution(* org.springframework.data.redis.core.RedisTemplate.execute*(..)),覆盖execute、executePipelined、executeReadOnly,不拦getConnection()(否则会把连接池等待误判为Redis慢)
  • 用StopWatch拆成三段:connection acquisition(连接获取)、serialization(序列化)、command execution(纯命令耗时),每段单独打日志
  • 对不同命令设动态阈值:GET/SET >20ms打ERROR;HGETALL/LRANGE >100ms打WARN;SCAN >500ms且isScan:true才告警,避免误杀合理慢操作
  • 生产环境别全量开启future.get()阻塞测时,改用采样:比如每1000次execute()中随机抽1次做完整计时

连接池配置不合理会让慢查询问题雪上加霜

很多人以为调大max-active就能解决问题,其实错得离谱。Lettuce连接池不是“越多越好”,而是要匹配实际并发模型:

  • max-active设太高(比如>64),反而加剧线程竞争,导致borrowObject()锁争用变高,大量线程卡在AbstractQueuedSynchronizer$ConditionObject.await()
  • min-idle设为0是危险操作——流量低谷时连接全被回收,突增流量来临时要重新建连,触发TCP握手+认证开销,放大超时概率
  • 必须配max-wait(如5000ms),否则连接池耗尽时线程无限等待;同时配time-between-eviction-runs和min-evictable-idle-time防连接假死
  • 云环境(如蓝易云)要特别注意安全组入站规则是否放通Redis端口,否则连接池会因“连不上”而非“读超时”持续重试,把max-wait耗尽

最容易被忽略的三个点

第一,RedisTemplate的execute()返回Future,AOP里不调get()就永远测不准真实执行时间;第二,JdkSerializationRedisSerializer序列化一个大Map可能比Redis命令本身还慢,但日志里只显示“命令超时”;第三,scan类命令天然慢,但如果你没传SCAN的COUNT参数,默认每次只扫10个key,百万数据要扫十万次——这根本不是Redis慢,是你代码写法有问题。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2791

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6447

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2688

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4769

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4335

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

8252

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

663

2024.04.07

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn