必须用redis缓存拦截90%以上读请求以缓解mysql压力;需确认redis服务运行、正确配置框架缓存驱动、规范缓存键名、实现读写闭环及主动失效机制,并添加ttl随机偏移防雪崩。

在ThinkPHP或Laravel等主流PHP框架中,频繁查询用户资料、商品列表等热点数据会导致MySQL连接数飙升、慢查询堆积。直接加索引或优化SQL只能缓解表层压力,真正要切断重复请求对数据库的穿透,必须让90%以上的读请求止步于内存缓存层。
确认Redis服务已就绪
先检查Redis服务是否正常运行:执行 redis-cli ping,返回 PONG 才能继续。若提示“Connection refused”,说明Redis未启动或端口被防火墙拦截,此时所有缓存逻辑都会降级为直连数据库。
用 ps aux | grep redis 查看进程,确认监听的是默认6379端口;如使用非标端口(比如6380),后续所有连接配置必须显式指定该端口。
ThinkPHP中启用Redis缓存驱动
打开 config/cache.php 文件,将 'type' 值从 'file' 改为 'redis':
'type' => 'redis',<br>'host' => '127.0.0.1',<br>'port' => 6379,<br>'timeout' => 0,<br>'expire' => 3600
注意:【'timeout' => 0 表示永不超时,但实际业务中必须设为正整数,否则缓存永不过期将导致脏数据长期滞留】。生产环境建议设为 3600(1小时)或根据数据更新频率动态调整。
保存后执行 php think clear 清除框架缓存,避免旧配置残留。
Laravel中配置Redis作为默认缓存
方法一:修改 .env 文件
REDIS_HOST=127.0.0.1<br>REDIS_PASSWORD=null<br>REDIS_PORT=6379<br>CACHE_DRIVER=redis
方法二:在 config/cache.php 中确认 'default' 指向 'redis',并检查 'stores.redis.connection' 是否为 'default'。
执行 php artisan config:clear 刷新配置,再运行 php artisan tinker 测试:Cache::put('test_key', 'ok', 60); Cache::get('test_key') 返回 "ok" 即成功。
在控制器中实现缓存读写闭环
第一步:定义缓存键名规则——不要用硬编码字符串,例如 "user_{$id}",而应统一为 "user:{$id}:profile"。冒号分隔层级便于后期批量清理,比如 redis-cli keys "user:*:profile" 可精准扫描。
第二步:封装读取逻辑,优先查缓存,未命中再查DB并回填:
$key = "user:{$userId}:profile";<br>$data = Cache::get($key);<br>if ($data === null) {<br> $data = User::find($userId)->toArray();<br> Cache::put($key, $data, 3600);<br>}
第三步:绑定数据变更事件——当用户资料更新时,必须主动删除对应缓存:Cache::forget("user:{$userId}:profile")。这一步不能依赖TTL自动过期,否则会出现长达1小时的数据不一致。
第四步:为防止缓存雪崩,对同一类缓存键设置随机TTL偏移量。例如基础TTL为3600秒,实际写入时用 3600 + rand(0, 300) 替代固定值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











