You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中文件缓存与内存缓存的性能对比及无第三方软件场景下的缓存最佳实践

Laravel中内存缓存 vs 文件缓存:性能与最佳实践

嘿,刚好在Laravel里折腾过这俩本地缓存方案,不用Redis这类第三方工具的话,内存缓存(array驱动)和文件缓存(file驱动)就是最常用的选择了,我来给你唠唠它们的性能表现、适用场景和踩过的坑~

核心性能差异先搞懂

本质上的区别就是存储介质:内存缓存完全在PHP进程的内存里,文件缓存则存在服务器磁盘上。这直接决定了它们的性能和适用场景:

内存缓存(Memory Cache,Laravel array驱动)

  • 性能表现:读写速度快到离谱,几乎是瞬时完成——毕竟没有磁盘IO开销,就是内存里的数组操作。但有个关键问题:每个PHP-FPM Worker进程都有自己独立的缓存副本。比如你服务器开了10个Worker,那同一份缓存数据会被存10次,内存占用会随Worker数量线性上涨。而且进程重启(比如FPM reload)或者请求结束后,缓存就直接清空了。
  • 最佳适用场景:
    • 单请求生命周期内复用的临时数据(比如当前用户的权限集合、请求内计算的复杂结果)
    • 不需要跨进程共享的高频访问小数据
    • 对响应速度要求极高,且数据量不大的场景
  • Laravel配置&注意事项:
    • 把.env里的CACHE_DRIVER改成array就行
    • 别用来存需要持久化超过请求周期的数据——比如你存了一个热门文章的浏览量,FPM一重启就没了,白忙活
    • 避免存大体积数据,不然多个Worker会吃掉你服务器大量内存,得不偿失

文件缓存(File Cache,Laravel file驱动)

  • 性能表现:速度肯定不如内存,但取决于你的磁盘——用SSD的话读写延迟会低很多,机械盘就慢不少。Laravel会把缓存数据序列化后存在storage/framework/cache/data目录下,读取时再反序列化,所以会有一点点序列化开销。但优点很明显:所有进程共享缓存,内存占用低,服务器重启后缓存还能保留(除非手动清理)。
  • 最佳适用场景:
    • 需要跨请求、跨进程共享的缓存数据(比如全站配置、热门文章的统计数据、商品基础信息)
    • 缓存有效期较长(几分钟到几小时),且数据量适中的场景
    • 服务器内存有限,不想因为多Worker占用过多内存的情况
  • Laravel配置&注意事项:
    • 配置.env的CACHE_DRIVER=file
    • 一定要确保storage/framework/cache目录有正确的读写权限(一般设为755,用户组是www-data),不然缓存会写失败
    • 别存超大体积的数据——比如几MB的大数组,序列化/反序列化和磁盘IO都会拖慢响应
    • 定期用php artisan cache:clear或者php artisan cache:prune清理过期缓存,避免磁盘被冗余数据占满

亲测性能参考(本地SSD环境)

我之前用Laravel的Benchmark工具做过简单测试,代码大概是这样:

use Illuminate\Support\Facades\Benchmark;

Benchmark::dd([
    'memory_set' => fn() => cache()->put('test_key', str_repeat('a', 1000), 3600),
    'memory_get' => fn() => cache()->get('test_key'),
    'file_set' => fn() => cache()->store('file')->put('test_key', str_repeat('a', 1000), 3600),
    'file_get' => fn() => cache()->store('file')->get('test_key'),
]);

测试结果大概是:

  • 内存缓存的读写都在0.1ms以内,几乎可以忽略
  • 文件缓存的写入在1-5ms,读取在0.5-2ms左右,比内存慢,但大部分场景下完全够用

综合最佳实践总结

  • 单请求内复用的数据,优先用内存缓存——速度最快,没毛病
  • 跨请求共享的持久化缓存,用文件缓存——只要磁盘不是太差,性能完全能打
  • 别用内存缓存存长期数据,进程重启直接清零,踩过这个坑的人懂的都懂
  • 文件缓存定期清理过期内容,不然磁盘会越来越大
  • 超高频访问的共享数据,可以搞个“二级缓存”:先读内存缓存,没有再读文件缓存,然后把数据写入内存——既享受到内存的速度,又能跨进程共享

内容的提问来源于stack exchange,提问作者mazen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:52:48