Laravel 8切换Redis/Memcached缓存需先设CACHE_DRIVER=redis,再配置prefix防多租户冲突,优选igbinary序列化减内存占用,并按数据类型分级设置TTL防穿透。

在Laravel 8中将缓存后端从默认的file切换为Redis或Memcached,能直接降低I/O延迟、支撑更高并发请求,避免因文件锁或磁盘IO瓶颈导致响应卡顿——尤其当应用部署在Debian服务器且日均请求超5万时,不改驱动就调参数等于给自行车换碳纤维轮胎。
确认并启用高性能缓存驱动
编辑.env文件,将CACHE_DRIVER值设为redis或memcached:
CACHE_DRIVER=redis
这一步必须做在配置修改前,否则config/cache.php里的store定义不会被加载。如果跳过此步直接改配置文件,Cache::get()仍走file驱动,所有后续优化全部失效。
运行php artisan config:clear清空配置缓存,再执行php artisan tinker验证连接:
【Cache::store('redis')->put('test_conn', 'ok', 10) === true】
配置Redis连接参数(含安全前缀)
打开config/cache.php,定位到'stores' => [...]区块,在redis配置项内补充prefix和connection:
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
'prefix' => env('CACHE_PREFIX', 'laravel8_')
],
然后在.env中添加:
CACHE_PREFIX=production:tenant_xyz:
这个前缀会自动加在所有缓存键开头,比如Cache::put('user_123', $data)实际存入Redis的是production:tenant_xyz:user_123。没有它,多租户系统里A公司用户可能读到B公司的缓存数据。
切换序列化方式减内存占用
方法一:改用igbinary(需PHP扩展支持)
在config/cache.php的redis store中加入'serialize' => 'igbinary';
方法二:禁用序列化(仅限字符串/数字)
改用Cache::store('redis')->raw()接口直接存原始字符串,跳过PHP serialize();
方法三:升级到Laravel 9+后启用msgpack(当前Laravel 8不原生支持,需手动集成)
默认serialize()会让一个User模型缓存体积膨胀3~5倍,10万条缓存可能吃掉Redis 1.2GB内存;换成igbinary可压缩至原大小的40%左右。
设置合理TTL防穿透与陈旧
第一步:识别数据类型
① 读多写少、变更周期明确(如站点开关、分类树)→ TTL设为略大于业务容忍陈旧时间,例如“每小时更新的统计”设3900秒;
② 实时性敏感(如用户余额、订单支付状态)→ 【禁用Cache::remember()】,改用数据库行锁+双删策略;
③ 耗时查询(如JOIN 4张表+GROUP BY)→ TTL不低于300秒,否则高并发下缓存击穿会压垮DB。
第二步:统一封装TTL逻辑
在App/Helpers/CacheHelper.php中定义:
public static function ttl($type) { return match($type) { 'stats' => 3900, 'profile' => 7200, 'config' => 86400 }; }
第三步:调用时显式传参
Cache::remember('user_profile_'.$id, CacheHelper::ttl('profile'), fn() => User::with('roles')->find($id));



















