跳转到主要内容

什么是缓存

数据库查询、外部 API 调用等操作 CPU 与网络成本高,可能耗时数秒。 如果反复获取相同数据,可以把结果保存到缓存,后续请求就能高速处理。 Laravel 提供了统一 API,支持 Memcached、Redis、DynamoDB、数据库等多种缓存后端。
默认使用 database 驱动。切换到 Redis 或 Memcached 可获得更高性能。

缓存配置

config/cache.php

缓存配置集中在 config/cache.php。通过 CACHE_STORE 环境变量选择默认驱动:

可用驱动

将序列化后的缓存数据保存到数据库表。Laravel 11 及以上的新项目已包含迁移。
如无迁移可使用:
保存到文件系统。无需额外配置,适合小型应用。
内存中高速缓存,生产环境最常用。需要 PhpRedis 扩展或 predis/predis
需要 Memcached PECL 扩展。在 config/cache.php 中配置服务器:
使用 AWS DynamoDB。需先创建表并安装 AWS SDK:
将任意 Filesystem 磁盘作为键值缓存。适合直接复用已有 S3 磁盘:
array 只在请求内有效,null 忽略所有操作。用于自动化测试。

缓存驱动层次

基本操作

获取 Cache 门面

多个存储切换:

取值:Cache::get()

不存在时返回 null,可指定默认值。

存值:Cache::put()

只在键不存在时存入用 add()(原子操作):
永久存储:

取或存:Cache::remember()

最常用的方式。若缓存中已有则返回,无则运行闭包并存回。
Cache::remember() 一行即可完成「查缓存 → 未命中则取 → 写入缓存」的三步。数据库查询与外部 API 响应缓存都适用。

remember() 流程

永久存储版本:
若需要知道数据是否来自缓存,可用 rememberWithWarmth()

Stale While Revalidate

Cache::flexible() 指定「新鲜期」和「可容忍陈旧期」两个时长,向用户返回旧数据的同时后台刷新缓存:

存在性检查

增减

取出后删除:Cache::pull()

删除:Cache::forget()

Cache::flush() 会忽略「前缀」设置删除全部条目。多应用共用缓存时请谨慎。
Cache::flushLocks() 可清理所有原子锁。

延长 TTL:Cache::touch()

缓存 memoization

memo 驱动会在同一请求内把缓存值缓存到内存,减少对存储的往返:

缓存标签

将相关缓存分组,可整体删除。
filedynamodbdatabasestorage 驱动不支持缓存标签。需 redismemcached

结构

存取

删除

按用户或文章分组失效缓存时非常有用。例如 Cache::tags(['user', "user:{$userId}"])->flush() 清除该用户相关的所有缓存。

原子操作(锁)

Cache::lock() 可实现分布式锁,避免并发冲突。
该功能在 memcachedredisdynamodbdatabasefilearray 驱动中可用。所有服务器需连接同一中心缓存服务器。

基础锁

传闭包会在结束时自动释放:

等待锁

或用闭包:

防止重复执行:withoutOverlapping()

限制并发数:funnel()

跨进程移交锁

强制释放:

刷新锁

延长当前锁的 TTL:

缓存辅助函数

cache() 提供更简洁的写法:

实践示例

缓存数据库查询

1

在控制器中缓存

2

数据更新时清除

缓存 Eloquent 模型

缓存 API 响应

使用标签分组

小结

  • 开发 / 小型filedatabase
  • 生产 / 高流量redis(可搭配 Laravel Horizon 监控)
  • AWS 环境dynamodb 或复用 S3 的 storage
  • 测试arraynull
  • 缓存键在整个应用中保持唯一(如 users:1:profile
  • 数据更新后用 Cache::forget()Cache::tags()->flush() 及时失效
  • TTL 要与数据更新频率匹配
  • Cache::remember() 让未命中的处理更简洁
  • 生产环境建议 Redis 并考虑故障转移
最后修改于 2026年7月18日