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

Laravel缓存设置周期及视图自动缓存频率配置咨询

Laravel视图缓存自定义与场景化实现方案

一、先理清Laravel默认视图缓存逻辑

Laravel默认的视图缓存是编译缓存:把Blade模板编译成原生PHP文件存在storage/framework/views目录下,只有当你修改了Blade视图文件内容时,才会自动重新编译。这个缓存和业务数据(比如文章、标签)的变更完全无关——哪怕数据库里的文章改了,只要视图文件没动,Laravel不会自动重新渲染视图内容。

二、自定义前端视图缓存的核心方案

针对你的博客场景,需要的是基于业务数据的内容缓存,而非视图编译缓存,常用两种实现方式:

1. 视图片段缓存(适合局部内容)

用Blade的@cache指令(Laravel 9+支持)直接包裹需要缓存的视图片段,指定缓存键和过期时间:

@cache('article_content_' . $article->id, now()->addDays(7))
    <div class="article-content">
        {{ $article->content }}
        <div class="tags">
            @foreach($article->tags as $tag)
                <span>{{ $tag->name }}</span>
            @endforeach
        </div>
        <div class="category">{{ $article->category->name }}</div>
    </div>
@endcache

这种方式会把包裹的HTML片段缓存起来,后续访问直接读取缓存,无需重复查询数据库。

2. 控制器层缓存(适合整页/复杂数据)

如果需要缓存整页数据+视图,可以在控制器里用Cache::remember先缓存查询结果,再传给视图:

public function show(Article $article)
{
    // 缓存文章及其关联数据,过期时间设为7天
    $articleData = Cache::remember('article_full_' . $article->id, now()->addDays(7), function () use ($article) {
        return $article->load(['tags', 'category']);
    });

    return view('articles.show', compact('articleData'));
}

三、数据变更时自动刷新缓存

默认缓存不会因数据变更自动失效,需在模型事件里手动清除对应缓存。比如在Article模型中添加:

protected static function booted()
{
    // 文章保存、更新、删除时,清除该文章的缓存
    static::saved(function ($article) {
        Cache::forget('article_content_' . $article->id);
        Cache::forget('article_full_' . $article->id);
    });

    static::deleted(function ($article) {
        Cache::forget('article_content_' . $article->id);
        Cache::forget('article_full_' . $article->id);
    });
}

这样管理员发布/修改/删除文章时,对应缓存会被清除,下次访问会重新查询数据并生成新缓存,完全匹配你的需求。

四、阅读量的特殊缓存处理

阅读量需随访问更新,不能和文章内容长期绑定缓存,需单独处理:

方案:独立缓存+定时过期

在控制器里单独处理阅读量的缓存,设置较短的过期时间(比如5分钟),每次访问先尝试取缓存,缓存失效时再从数据库读取并更新缓存:

public function show(Article $article)
{
    // 处理文章主体缓存(沿用之前的逻辑)
    $articleData = Cache::remember('article_full_' . $article->id, now()->addDays(7), function () use ($article) {
        return $article->load(['tags', 'category']);
    });

    // 处理阅读量缓存,每5分钟刷新一次
    $viewCount = Cache::remember('article_view_count_' . $article->id, now()->addMinutes(5), function () use ($article) {
        return $article->view_count;
    });

    // 异步更新阅读量(避免阻塞请求)
    dispatch(function () use ($article) {
        $article->increment('view_count');
    });

    return view('articles.show', compact('articleData', 'viewCount'));
}

这里用异步任务更新数据库阅读量,避免每次访问写DB影响性能;前端展示的是5分钟内的缓存值,既保证性能,又不会让数据延迟过度。

补充:精细化缓存控制(可选)

如果场景更复杂,可使用缓存标签(需支持标签的缓存驱动,如Redis),给所有文章相关缓存打上articles标签,管理员发布新文章时直接清除整个标签下的缓存,无需逐个操作:

// 缓存时打标签
Cache::tags(['articles'])->put('article_content_' . $article->id, $content, now()->addDays(7));

// 清除所有文章缓存
Cache::tags(['articles'])->flush();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:30:25