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

Laravel中实现响应可选缓存及强制刷新的最优方案是什么?

Laravel API 可选响应缓存及强制刷新实现方案

你提到的通过额外请求头加中间件实现绕过缓存的方案是合理的,也是生产环境常用的实现方式,结合不同业务场景还有两种更优的选择,具体实现如下:

方案1:请求头+中间件控制缓存跳过(匹配你提到的需求)

适合需要前端手动触发强制刷新的场景,实现逻辑简单可控:

  1. 生成中间件
    运行命令创建绕过缓存的中间件:
    php artisan make:middleware BypassCache
  2. 编写中间件逻辑
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Cache;
class BypassCache
{
    public function handle($request, Closure $next, $cacheKey = null)
    {
        // 判断是否携带强制刷新请求头
        if ($request->header('X-Force-Refresh') === 'true' && $cacheKey) {
            // 删除对应缓存,后续请求会自动生成新缓存
            Cache::forget($cacheKey);
        }
        return $next($request);
    }
}
  1. 注册中间件
    在app/Http/Kernel.php的$routeMiddleware数组中添加:
    'bypass.cache' => \App\Http\Middleware\BypassCache::class,
  2. 路由绑定中间件
Route::get('/users', [UserController::class, 'index'])->middleware('bypass.cache:users');

控制器无需修改原有逻辑,前端需要强制刷新时只要在请求头携带X-Force-Refresh: true即可。

方案2:模型事件自动失效缓存(更推荐的通用方案)

不需要前端手动触发,只要用户数据发生变更就自动清空旧缓存,从根源避免返回过期数据:

  1. 创建模型观察者
    运行命令:php artisan make:observer UserObserver --model=User
  2. 编写观察者逻辑
<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
class UserObserver
{
    public function saved(User $user)
    {
        Cache::forget('users');
    }
    public function deleted(User $user)
    {
        Cache::forget('users');
    }
}
  1. 注册观察者
    在app/Providers/AppServiceProvider.php的boot方法中添加:
    \App\Models\User::observe(\App\Observers\UserObserver::class);

方案3:版本号控制缓存批量刷新

适合后台批量更新用户数据后需要全量刷新缓存的场景:
将缓存键改为带版本号的格式,比如users_v1,版本号可以存在配置或缓存中,需要全量刷新时只要修改版本号,所有旧缓存会自动失效,控制器代码修改如下:

public function index()
{
    $cacheVersion = Cache::get('users_cache_version', 1);
    $cacheKey = "users_v{$cacheVersion}";
    return Cache::remember($cacheKey, 3600, function() {
        return new UserCollection(User::all());
    });
}

需要全量刷新时只要执行Cache::put('users_cache_version', Cache::get('users_cache_version', 1) + 1)即可。

注意事项

  • 强制刷新的接口建议加权限校验,避免公开接口被恶意请求刷爆数据库
  • 多实例部署时必须使用Redis、Memcached等共享缓存驱动,不能使用文件、数组等本地缓存
  • 缓存API资源时建议先转成数组再缓存,避免序列化异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:05