用JMeter模拟缓存雪崩导致登录接口性能问题的实战 - 实践
一、 模拟目标
模拟大量用户同时请求登录接口,当 Redis 验证码缓存失效后,接口变慢、数据库压力飙升。
第一步:用 JMeter 录制登录请求
1.添加线程组:
- 线程数:200(模拟200个用户)
- Ramp-Up:1(立即发起)
- 循环次数:1(每人请求1次)
2.添加 HTTP 请求 Sampler:
- Method: POST
- URL: http://localhost:8085/sso/login
- Body Data (Raw):
{
"username": "admin",
"password": "123456"
}
- Content-Type: application/json
3.添加结果树、聚合报告等监听器
4.先登录一次,查看缓存存在后再重新运行,先压测一轮,看看性能正常。
docker容器查看redis缓存命令:docker exec -it redis redis-cli keys “mall:ums:member:*”
1.第一轮聚合报告的压测结果:
2.JDK 工具查看 JVM 内存
第二步:模拟缓存雪崩场景(Redis 验证码失效)
你可以手动清除 Redis 缓存,或者模拟:
docker exec -it redis sh -c 'redis-cli keys "mall:ums:member:*" | xargs -r redis-cli del'

然后再压一轮,这时候就会发现:
- 登录变慢,响应时间变长,吞吐量降低
- 后端转查数据库,CPU 飙升
1.第二轮聚合报告的压测结果:
2.JDK 工具查看 JVM 内存
第三步:优化建议(企业实战中的修复策略)
1.验证码缓存设置随机过期时间
redisTemplate.opsForValue().set("verify_code:" + phone, code, 60 + new Random().nextInt(30), TimeUnit.SECONDS);
2.设置请求频率限制(如滑动窗口限流)
3.Redis 使用本地缓存兜底(如 Caffeine)
✅ 最后你可以做的分析维度:
| 指标 | 如何观察 |
|---|---|
| QPS | JMeter 聚合报告 |
| 吞吐量 | 每秒数据包大小(JMeter) |
| 响应时间 | 平均、最大、最小响应时间 |
| 后端资源 | top / docker stats 观察 CPU、内存 |
| Redis QPS | redis-cli monitor + slowlog get |
二、 性能问题排查的标准路径(适用于登录接口变慢)
我们从测试工程师的角度,按照“从外到内、由粗到细”的思维,一步步分析:
✅ 第一步:通过压测工具观察现象
使用 JMeter 或其他工具,发现:
- 登录接口响应时间从 <100ms 升高到 >500ms 或更久;
- TPS/QPS 明显下降;
- RT 曲线抖动大(偶发超时)。
✅ 第二步:从日志中确认异常
查看 Java 项目的控制台或日志输出:
- 是否有频繁的数据库连接或查询日志?
- Redis 是否有大量 “MISS” 日志或连接失败?
- 有无错误堆栈、线程阻塞或 GC 频繁?
例如:
查 Spring Boot log,发现 Redis 连接丢失 或 频繁访问数据库:
✅ 第三步:确认 Redis 中缓存确实失效
手动执行命令:
docker exec -it redis redis-cli keys "mall:ums:member:*"
如果返回为空,就证明:缓存未命中,系统每次都查数据库。
查看 Redis 观察命中率:
✅ 第四步:观察数据库压力是否上升
登录 MySQL 容器或查看监控,发现活跃连接数/慢查询变多;
慢查询日志中可能有大量 SELECT * FROM ums_member WHERE username = ?;
命令示例:
SHOW PROCESSLIST;
SHOW GLOBAL STATUS LIKE '%Threads_connected%';

✅ 第五步:结合代码分析是否有缓存重建逻辑问题
查看登录接口代码,判断:
- 是否有从 Redis 取缓存 → 没有就查数据库 → 然后重建缓存的逻辑?
- 缓存是否设置了过期时间?是统一过期(容易雪崩)还是分散 TTL?
示例问题分析总结(以你刚才遇到的为例):
| 检查维度 | 结果 |
|---|---|
| 压测结果 | 登录接口响应时间变慢 |
| 日志分析 | 正常无报错,但响应明显延迟 |
| Redis keys | 被清空(缓存雪崩模拟成功) |
| 数据库 | 查询明显增加,可能会变慢 |
| 代码逻辑 | 用户登录依赖 Redis,缓存 miss 就查库 |
测试工程师定位技巧总结
| 技能 | 工具 |
|---|---|
| 性能趋势分析 | JMeter / Grafana / Prometheus |
| 日志排查 | tail, grep, ELK |
| Redis 缓存监控 | redis-cli, RedisInsight |
| 数据库瓶颈 | ySQL慢查询、执行计划、连接数 |
| Java 程序监控 | jvisualvm, Arthas, SkyWalking(高级) |
性能问题排查流程图
┌────────────┐
│ 性能问题发现(如响应变慢) │
└────┬───────┘
↓
┌────────────┐
│ 压测工具初步观察(如JMeter) │
│ - RT/TPS异常 │
│ - 错误率上升 │
└────┬───────┘
↓
┌────────────┐
│ 检查服务端日志 │
│ - 异常/堆栈/Gc频繁?│
└────┬───────┘
↓
┌────────────┐
│ 缓存命中情况 │
│ - Redis keys 是否存在?│
└────┬───────┘
↓
┌────────────┐
│ 数据库状态分析 │
│ - 连接数/慢查询是否飙升?│
└────┬───────┘
↓
┌────────────┐
│ 代码层缓存逻辑审查 │
│ - 是否批量过期(雪崩)?│
└────┬───────┘
↓
┌────────────┐
│ 总结问题定位 │
└────────────┘

浙公网安备 33010602011771号