这是一个非常经典但无法给出单一固定数值的问题。4 核 8G 的机器配合 MySQL,其 QPS(每秒查询率)上限完全取决于业务场景的复杂度、SQL 质量、缓存策略以及并发用户的行为模式。
在电商场景下,QPS 可以从 50 到 50,000+ 不等。为了给你一个具有参考价值的结论,我们需要分场景和架构层级来拆解分析:
1. 核心结论速览
- 纯数据库直接扛(无缓存/复杂 SQL):约 200 – 500 QPS。
- 场景:大量复杂的关联查询(JOIN)、未优化的慢 SQL、高并发下单扣减库存。
- 引入 Redis 缓存(热点数据):约 2,000 – 5,000 QPS。
- 场景:商品详情浏览、首页轮播图、秒杀活动前的预热。90% 以上的读请求被 Redis 拦截。
- 极致优化 + 读写分离 + 缓存(理想状态):约 10,000 – 30,000+ QPS。
- 场景:读多写少,索引完美,Redis 命中率极高,且数据库只处理写操作或极少量热数据读取。
2. 详细影响因素分析
A. 业务类型决定 QPS 量级
电商系统通常分为“读多写少”和“写多写少”两种极端:
-
商品详情页浏览(读操作)
- 特征:CPU 消耗低,IO 密集。
- 现状:如果加上 Redis 缓存,MySQL 几乎不承受压力。此时瓶颈通常在 Spring Boot 应用层的线程池或网络带宽。
- 预估:单台 4C8G 的 Spring Boot 服务配合 Redis,轻松支撑 5,000+ QPS 的读请求,数据库仅处理缓存穿透或回源时的少量流量。
-
下单/支付/库存扣减(写操作)
- 特征:事务锁竞争严重,磁盘 IO 压力大,CPU 消耗高。
- 现状:即使有 Redis 预扣库存,最终落库时仍需 MySQL 事务支持。4 核 CPU 在处理大量长事务或高锁竞争时,很容易出现死锁或响应变慢。
- 预估:纯写操作(如下单),单库通常只能支撑 300 – 800 QPS。超过这个值,数据库连接池会爆满,事务超时率飙升。
-
搜索与列表页(复杂查询)
- 特征:涉及多表 JOIN、模糊查询 (
LIKE %keyword%)、排序。 - 现状:这是最伤性能的。如果没有 Elasticsearch (ES) 介入,直接用 MySQL
LIKE查询,4 核机器可能在 50 QPS 就卡死了。 - 建议:此类场景必须上 ES,MySQL 仅作为存储层。
- 特征:涉及多表 JOIN、模糊查询 (
B. 架构组件的影响
| 组件 | 对 QPS 的贡献 | 说明 |
|---|---|---|
| Spring Boot 应用层 | 瓶颈点 1 | 默认 Tomcat 线程数有限。若代码中有同步阻塞 IO(如调用外部接口),QPS 会大幅下降。需调整 server.tomcat.threads.max。 |
| Redis | 倍增器 | 将 QPS 提升 10-50 倍的关键。必须缓存热点商品、配置、库存计数等。 |
| MySQL 配置 | 基础底座 | innodb_buffer_pool_size 应设为物理内存的 60%-70%(约 5GB)。4 核 CPU 适合做主从架构中的主库,但不宜承担过多计算型查询。 |
| 连接池 (HikariCP) | 调节阀 | 默认连接数可能不足。需根据并发量调大 maximum-pool-size,否则请求会在等待连接中耗尽。 |
3. 如何验证与优化?
如果你正在规划或测试这个项目,建议按以下步骤进行:
第一步:基准测试(压测)
使用 JMeter 或 Wrk 模拟真实场景。
- 测试用例 1:只读商品详情(带缓存)。
- 测试用例 2:创建订单(包含库存扣减、积分变更)。
- 测试用例 3:搜索商品列表。
观察指标:
- TPS/QPS:目标值是多少?
- RT (Response Time):平均响应时间是否超过 200ms?
- Error Rate:是否有 5xx 错误或超时?
- DB Load:MySQL 的
Threads_running是否持续为 0?CPU 是否长期 100%?
第二步:关键优化手段(针对 4C8G 环境)
-
强制引入 Redis:
- 商品详情、分类、优惠券等静态/半静态数据必须缓存。
- 设置合理的过期时间,避免缓存击穿。
-
数据库索引优化:
- 检查
EXPLAIN执行计划,确保所有查询走索引,杜绝全表扫描。 - 避免
SELECT *,只查需要的字段。
- 检查
-
异步化削峰:
- 下单流程中,非核心逻辑(如发送短信、记录日志、增加积分)通过 RabbitMQ/Kafka 异步处理,缩短数据库事务持有时间。
-
读写分离:
- 虽然只有 1 台 DB,但在代码层面可以配置主从路由(如果未来扩容容易)。对于当前 4C8G,重点是将读请求全部导向 Redis。
-
JVM 调优:
- 4C8G 机器,建议堆内存设置为
-Xms4g -Xmx4g,开启 G1 垃圾回收器 (-XX:+UseG1GC),减少 Full GC 带来的停顿。
- 4C8G 机器,建议堆内存设置为
4. 总结建议
对于 4 核 8G MySQL + Spring Boot 的配置:
- 如果是小型项目/内部商城/日活 < 1 万:该配置足够,只要做好 Redis 缓存和基础索引优化,能稳定支撑 3,000 – 5,000 QPS 的混合流量。
- 如果是中型项目/大促秒杀:该配置不足以直接抗住高并发写操作。
- 读流量:靠 Redis 扛。
- 写流量:需要引入消息队列削峰,或者考虑升级数据库规格(如 8 核 16G)及采用分库分表。
最终建议:不要迷信 QPS 数字,先进行全链路压测。在压测报告中,找到第一个达到瓶颈的组件(通常是数据库连接池或磁盘 IO),针对性优化后再评估容量。
云知识CLOUD