核心是“尽量不查”和“查得更聪明”,通过四层协同:缓存前置(本地+Redis多级)、连接复用(Swoole池)、查询瘦身(预加载+游标分页)、异步分流(消息队列+Redis记账),配合读写分离与负载分散,TP6可稳住QPS 8000+。

一万并发下频繁查数据库,核心不是“怎么查得更快”,而是“怎么尽量不查”和“查得更聪明”。ThinkPHP6本身不解决高并发瓶颈,但配合合理架构能稳住QPS在8000以上。关键在四层协同:缓存前置、连接复用、查询瘦身、异步分流。
缓存必须穿透到业务逻辑层
不能只靠Redis缓存首页或用户信息。对高频读接口(如商品详情、订单状态),要按业务维度做多级缓存:
- 本地缓存兜底:用file或apcu缓存热点配置、开关、基础字典,毫秒级响应,避免每次请求都打Redis
- Redis主缓存:对带参数的查询(如/api/order?user_id=123),用user_id:123:order_status作key,TTL设为业务可接受的陈旧窗口(比如5分钟)
- 主动失效+预热:订单状态变更后,立刻删除对应key;定时任务每小时预热TOP1000用户的常用数据,避免缓存雪崩
数据库连接池与查询精简双管齐下
默认PDO连接每次请求新建,一万并发意味着上万连接,MySQL直接扛不住。必须启用Swoole连接池:
- 在config/database.php中开启pool_size(建议80–120),并设置pool_get_timeout=3防卡死
- 禁止N+1:连表查询一律用withJoin()预加载,而不是在循环里反复查关联表
- 分页改用游标(cursor):传统limit offset在大数据偏移时性能断崖下跌,游标基于上一页最后ID,稳定高效
写操作必须异步化
一万并发里,哪怕10%是写请求(如日志记录、行为埋点、库存扣减),同步执行也会拖垮数据库。解决方案是剥离IO密集型动作:
立即学习“PHP免费学习笔记(深入)”;
- 日志类、统计类写入全部走消息队列(Redis List或RabbitMQ),由独立消费者进程批量落库
- 用户积分变动等强一致性场景,用Redis原子操作(INCRBY)先记账,再异步核对并更新MySQL
- 避免在HTTP响应中执行Db::transaction()——事务时间越长,锁竞争越激烈;改用最终一致性模型
读写分离与负载分散不可省略
单库撑一万并发是伪命题。必须物理拆分:
- 主库只负责写和强一致性读(如支付结果查询),从库承担90%的报表、列表、详情等读请求
- 用Db::connect('slave')显式指定从库连接,不要依赖框架自动路由(易出错)
- 静态资源、API网关、Redis、MySQL全部部署多节点,前端Nginx做加权轮询,后端服务无状态



















