用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)

✅ 最后你可以做的分析维度:

指标如何观察
QPSJMeter 聚合报告
吞吐量每秒数据包大小(JMeter)
响应时间平均、最大、最小响应时间
后端资源top / docker stats 观察 CPU、内存
Redis QPSredis-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 是否存在?│
└────┬───────┘
↓
┌────────────┐
│ 数据库状态分析 │
│ - 连接数/慢查询是否飙升?│
└────┬───────┘
↓
┌────────────┐
│ 代码层缓存逻辑审查 │
│ - 是否批量过期(雪崩)?│
└────┬───────┘
↓
┌────────────┐
│ 总结问题定位 │
└────────────┘
posted @ 2025-07-25 18:23  wzzkaifa  阅读(13)  评论(0)    收藏  举报