主流PHP框架普遍支持file、redis、memcached、apcu、database五种缓存驱动;Redis因功能全、性能高、支持标签与集群,成为生产首选;APCu适合作为本地一级缓存配合Redis二级共享缓存使用。

主流PHP框架(Laravel、ThinkPHP、Symfony)都原生支持多种缓存后端,但**不是所有驱动在所有环境下都可用或推荐**——关键看部署规模、数据一致性要求和运维能力。
哪些缓存驱动被框架普遍支持?
现代PHP框架通过统一的 Cache 接口抽象底层存储,常见驱动包括:
-
file:所有环境默认可用,无需扩展,但并发读写易出错,仅适合开发或单机小流量 -
redis:Laravel/ThinkPHP/Symfony 全系支持,需安装php-redis扩展和 Redis 服务;支持原子操作、过期、标签(Laravel)、管道,是生产首选 -
memcached:支持分布式,但不支持复杂数据结构和持久化;ThinkPHP 和 Laravel 支持,Symfony 需额外包;注意 PHP 的memcached扩展(非memcache)才支持 SASL 认证 -
apcu:仅限单机,无网络开销,适合本地缓存热点数据(如配置、路由),但不能跨进程共享(PHP-FPM 多 worker 下需配合apcu-bc) -
database:Laravel 支持,把缓存写进数据库表;调试方便,但性能差,绝不用于高并发场景
为什么 Redis 是大多数项目的默认推荐?
不是因为“它最火”,而是它在功能、稳定性和生态上做到了关键平衡:
- 支持
setex、hgetall、zrange等丰富命令,能应对计数器、排行榜、会话、锁等复合需求 - 单线程模型 + 非阻塞IO,QPS 轻松破万,远超文件或 APCu 的纯内存吞吐
- Laravel 的
Cache::tags()、ThinkPHP 的Tag功能依赖 Redis 的哈希结构模拟,Memcached 不支持标签失效 - 可配置 RDB/AOF 持久化,断电后不丢关键缓存(如用户登录态 token)
- 集群模式(Redis Cluster)天然适配微服务横向扩展,而 Memcached 集群需客户端分片,维护成本高
APCu 和 Redis 怎么搭配用才不浪费?
直接上 redis 并不总是最优解——本地高频小数据查 Redis 反而增加网络往返。推荐「多级缓存」策略:
立即学习“PHP免费学习笔记(深入)”;
- 第一层用
apcu缓存极热数据(如站点配置、菜单树),TTL 设为 60–300 秒,避免每次请求都打 Redis - 第二层用
redis做共享缓存,存用户资料、商品库存等需跨节点一致的数据 - Laravel 示例:用
apcu驱动做config和route缓存,redis驱动做业务数据缓存 - 注意:
apcu不支持过期自动清理旧键,长期运行可能内存泄漏,建议定期调用apcu_clear_cache()或启用apcu.gc_ttl
选型时最容易被忽略的三个坑
很多项目上线后才发现缓存没生效、数据不一致或突然变慢,往往栽在这三点:
-
缓存键命名没加环境前缀:开发、测试、生产共用一个 Redis 实例时,
user:123在多个环境互相覆盖——务必在prefix配置里加上环境标识,如prod_user:123 -
没处理缓存穿透:恶意请求大量不存在的 ID(如
/user/999999999),导致每次回源查 DB;应在缓存未命中时,对空结果也写入一个短 TTL(如 60 秒)的null占位符 -
更新数据时忘了删缓存:改了用户昵称却没执行
Cache::forget('user:123'),下次读到的就是脏数据;建议在 Eloquent Model 的saving/updating事件中统一处理
缓存不是加了就完事,真正难的是让缓存「该命中的时候命中,该失效的时候失效」——尤其在分布式环境下,键设计、失效时机、空值保护这些细节,比选哪个引擎重要得多。











