Laravel什么时候清除缓存?

时间:2016-07-07 16:00:44

标签: php laravel caching laravel-5 eloquent

我正在尝试将Redis与Laravel 5一起使用来缓存查询/结果,以使我的应用程序运行得更快。

但是,我有几个问题可以帮助我决定何时使用Cache以及什么时候不使用。

假设我有以下

$interview= Cache::remember('SomeUniqueKey', 180, function(){

    return SurveyInterview::where('user_id', 123)
                          ->with([
                                    'current_step.page',
                                    'pages'
                                ])
                          ->first();
});

前面的代码应该缓存eloquent返回的集合集。这共有3个查询。首先查询模型,然后查询current_step.page关系,最后查询pages关系。

我的理解是,只要我反复执行上面的代码,Laravel就会从缓存中返回集合,直到从缓存集合的180分钟开始。

问题

如果对我的数据库表进行了更新,laravel会自动删除缓存吗?在其他工作中,我会在更新SurveyInterview模型后删除缓存,还是每次更新模型时都必须手动删除缓存?

2 个答案:

答案 0 :(得分:10)

这个问题的答案实际上取决于正在使用的缓存驱动程序。

对于像MemcacheAPC这样的驱动程序,这些服务知道如何"垃圾收集"他们自己并自动刷新过期的条目。

对于File驱动程序,它依赖于文件创建的UNIX时间戳来确定它是否已过期。在尝试检索文件并确定已过期之前,不会删除该文件

对于Database驱动程序,它会存储expiration列,并可以确定该时间戳的过期方式。该记录在到期时不会自动删除 - 仅当尝试获取缓存条目并且发现它已过期时(类似于文件驱动程序)。

要回答这个首要问题,您是正确的remember()将继续从缓存中检索它,直到它过期。它通过在特定存储类上调用get()方法来实现,在文件和数据库的情况下,如果自动过期,则会刷新条目。当它由于到期而没有返回任何条目时,您的闭包逻辑将执行以生成一组新数据。

据我所知,不,它不会在发生更新时刷新缓存。快速搜索forgetflush的Illuminate \ Database文件夹并不表示它会这样做。话虽这么说,你可以检测到model events何时发生更新,并通过向模型中添加类似内容来轻松刷新缓存。

public static function boot()
{
    SurveyInterview::updated(function ($survey) {
        app('cache')->forget('my-survey-key-' . $survey->id);
    });
}

<强>参考

FileStore的: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Cache/FileStore.php

DatabaseStore:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Cache/DatabaseStore.php#L66

修改

Redis,就像Memcache和APC一样,自己处理同花顺。例如,请看:

答案 1 :(得分:3)

您必须手动删除缓存。

在您的示例中,您可以引用SomeUniqueKey而不是survey_userid

现在,您可以将以下事件添加到模型中,以便在更新与此缓存相关的数据时清除缓存。

public static function boot()
{
    parent::boot();

    static::updated(function($survey)
    {
        Cache::forget('survey_'. $survey->user()->id);
    }
}