推荐选用阿里云瑶池tair:内置tairbloom布隆过滤器防穿透、tairstring cas锁+热点探测防击穿、ttl打散与多可用区架构防雪崩,性能达开源redis 3倍,sla 99.99%。

ThinkPHP6 要稳住 1 万并发,光靠“加服务器”或“开 Redis”远远不够。真正卡脖子的是请求在多个环节的叠加阻塞——缓存未命中时全量打库、连接池空转、降级逻辑缺失、热点 Key 瞬间击穿,这些一齐爆发,就是雪崩。
堵住缓存三大漏洞:穿透、击穿、雪崩
这三类问题不是理论风险,是 1 万并发下必然触发的故障链起点:
-
穿透:查
user_id = 999999999这种根本不存在的 ID,每次都不走缓存,直接压数据库。用Cache::remember()包裹查询时,务必加空值缓存(如Cache::set('user_999999999', null, 60)),并设较短过期时间防误伤 -
击穿:首页 Banner 的 key
home_banner到期瞬间,上千请求同时重建缓存。解决方案不是加锁(PHP-FPM 下锁文件反而加剧排队),而是改用「逻辑过期」:Cache::set('home_banner', ['data' => $banner, 'expire_at' => time() + 3600]),读取时先判断expire_at,过期则异步刷新,当前仍返回旧数据 -
雪崩:所有缓存统一设
3600秒过期,整点集体失效。必须错峰——TTL 加随机偏移:3600 + rand(1, 300);关键数据启用双缓存机制(Redis + 本地 APCu),本地缓存不设过期,仅作兜底
数据库不崩的关键动作
MySQL max_connections=200 时,1 万并发哪怕只 5% 查库,也早超限了。不能只调大参数,要从源头减压:
- 禁用 ThinkPHP 默认的「连接自动释放」机制,在数据库配置中显式开启长连接:
'params' => [\PDO::ATTR_PERSISTENT => true],并同步调大 MySQL 的wait_timeout(建议 ≥ 300) - 读写分离必须按需启用,不要全局开启。在核心查询前手动指定连接:
Db::connect('slave')->table('log')->where(...)->select() - 事务粒度必须最小化。避免
Db::transaction()包裹整个接口逻辑,改成只包写操作;事务内禁止调用外部 HTTP 或缓存写入
让非核心路径彻底退出主流程
登录成功后发短信、记录埋点、更新用户活跃时间……这些操作一旦失败或延迟,会拖垮整个登录链路。1 万并发下,它们就是雪崩导火索:
- 全部剥离控制器,改用事件驱动:
Event::trigger('user.login.success', $user),并在app/event.php中绑定异步监听器 - 队列任务必须设熔断:配置
maxTries=2、delay=5,失败后写入带_fallback后缀的缓存键,下次直接跳过该任务 - 远程 HTTP 调用一律加降级:timeout ≤ 2000ms,catch 后返回空结构或默认值,绝不抛异常;关键业务接口(如支付回调验证)才允许同步阻塞
基础设施层必须协同加固
框架再优化,底座撑不住也白搭:
- Nginx 配置
worker_connections 20480,启用reuseport,避免 accept 队列积压 - PHP-FPM 使用
pm = static模式,pm.max_children设为物理核数 × 4(如 16 核设 64),禁用pm.start_servers动态伸缩(高并发下扩容太慢) - Redis 必须启用
maxmemory-policy allkeys-lru,并监控evicted_keys指标——若持续增长,说明缓存容量已到临界,需扩容或精简 key
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











