什么是缓存
数据库查询、外部 API 调用等操作 CPU 与网络成本高,可能耗时数秒。 如果反复获取相同数据,可以把结果保存到缓存,后续请求就能高速处理。 Laravel 提供了统一 API,支持 Memcached、Redis、DynamoDB、数据库等多种缓存后端。默认使用
database 驱动。切换到 Redis 或 Memcached 可获得更高性能。缓存配置
config/cache.php
缓存配置集中在config/cache.php。通过 CACHE_STORE 环境变量选择默认驱动:
可用驱动
database(默认)
database(默认)
将序列化后的缓存数据保存到数据库表。Laravel 11 及以上的新项目已包含迁移。如无迁移可使用:
file
file
保存到文件系统。无需额外配置,适合小型应用。
redis
redis
内存中高速缓存,生产环境最常用。需要 PhpRedis 扩展或
predis/predis。memcached
memcached
需要 Memcached PECL 扩展。在
config/cache.php 中配置服务器:dynamodb
dynamodb
使用 AWS DynamoDB。需先创建表并安装 AWS SDK:
storage
storage
将任意 Filesystem 磁盘作为键值缓存。适合直接复用已有 S3 磁盘:
array / null(测试用)
array / null(测试用)
array 只在请求内有效,null 忽略所有操作。用于自动化测试。缓存驱动层次
基本操作
获取 Cache 门面
取值:Cache::get()
不存在时返回 null,可指定默认值。
存值:Cache::put()
add()(原子操作):
取或存:Cache::remember()
最常用的方式。若缓存中已有则返回,无则运行闭包并存回。
remember() 流程
永久存储版本:rememberWithWarmth():
Stale While Revalidate
Cache::flexible() 指定「新鲜期」和「可容忍陈旧期」两个时长,向用户返回旧数据的同时后台刷新缓存:
存在性检查
增减
取出后删除:Cache::pull()
删除:Cache::forget()
Cache::flushLocks() 可清理所有原子锁。
延长 TTL:Cache::touch()
缓存 memoization
memo 驱动会在同一请求内把缓存值缓存到内存,减少对存储的往返:
缓存标签
将相关缓存分组,可整体删除。结构
存取
删除
原子操作(锁)
Cache::lock() 可实现分布式锁,避免并发冲突。
该功能在
memcached、redis、dynamodb、database、file、array 驱动中可用。所有服务器需连接同一中心缓存服务器。基础锁
等待锁
防止重复执行:withoutOverlapping()
限制并发数:funnel()
跨进程移交锁
刷新锁
延长当前锁的 TTL:缓存辅助函数
cache() 提供更简洁的写法:
实践示例
缓存数据库查询
1
在控制器中缓存
2
数据更新时清除
缓存 Eloquent 模型
缓存 API 响应
使用标签分组
小结
驱动选型
驱动选型
- 开发 / 小型:
file或database - 生产 / 高流量:
redis(可搭配 Laravel Horizon 监控) - AWS 环境:
dynamodb或复用 S3 的storage - 测试:
array或null