Redis驱动在高并发频繁读写场景下明显快于文件缓存,但文件缓存更简单可靠,适合开发调试或小流量项目;性能差异关键取决于环境隔离、操作方式、数据规模和测量维度。

Redis驱动明显快于文件缓存,尤其在高并发、频繁读写场景下。但文件缓存胜在简单可靠、无需额外服务,适合开发调试或小流量项目。实测关键不在“谁更快”,而在于你是否用对了方法——包括环境隔离、操作方式、数据规模和测量维度。
准备真实可比的测试环境
避免因配置偏差导致结果失真:
- 确保 Redis 服务已运行且连接正常(
redis-cli ping返回PONG);检查.env中CACHE_DRIVER=redis或file,并清空配置缓存:php artisan config:clear - 统一使用
Cache::store('xxx')显式指定驱动,不依赖默认配置,防止意外混用 - 测试前清空各自缓存:对 Redis 执行
php artisan tinker→Redis::flushdb();对 file 执行rm -rf storage/framework/cache/data/* - 关闭 OPcache 的脚本级缓存干扰(临时设置
opcache.enable_cli=0),或在 CLI 环境中测试(如php artisan tinker),避开 Web 服务器层变量污染
用 Tinker 做可控单点性能测量
在 php artisan tinker 中逐条执行,记录 PHP 内置时间戳,排除网络与框架启动开销:
-
写入测试(100 次):
$start = microtime(true); for($i=0; $i<100; $i++) { Cache::store('redis')->put("key_{$i}", str_repeat('x', 256), 3600); } echo microtime(true) - $start;
同样逻辑替换为store('file')对比 -
读取测试(命中场景):
先批量写入 100 条,再循环读取:Cache::store('redis')->get("key_{$i}"),统计总耗时 -
注意避坑:不要用
remember()测速,它含数据库/回调等额外逻辑;避免用超大值(如 10MB 字符串),Redis 受 TCP 包大小和序列化影响会放大差异
关注真实业务中的差异点
性能不只是“快多少秒”,更要看出现在哪、影响什么:
- 并发冲突:文件缓存在多进程写同一 key 时可能因文件锁阻塞(尤其 NFS 或低配磁盘),Redis 则靠原子命令天然规避
-
TTL 行为差异:文件驱动靠
filemtime()判断过期,精度为秒;Redis 使用毫秒级EXPIRE,且支持惰性+定期双清理,实际失效更及时 -
计数器行为不同:执行
Cache::increment('counter')时,file 驱动对不存在的 key 不落盘(只返回 1),Redis 会立即创建并设初值,逻辑一致性更强 - 内存 vs 持久性权衡:Redis 断电即丢(除非开启 RDB/AOF),file 缓存重启后仍在——这对某些配置类缓存可能是刚需
别忽略操作系统对文件缓存的加成
Linux 的 page cache 会让热文件读取接近内存速度,所以实测中“文件缓存很慢”常是假象:
- 首次读取一个新 key,file 需要磁盘寻道 + 读取 + 反序列化,延迟明显;但第二次起大概率走内存页缓存,耗时骤降 5–10 倍
- 可验证:用
echo 3 > /proc/sys/vm/drop_caches清空系统缓存后重测,对比有无 page cache 的差距 - 这意味着——如果你的应用缓存 key 分布集中(如固定几个配置项),file 驱动的实际体验未必差;但若 key 高度离散(如用户会话 ID),Redis 的优势就彻底释放



















