Laravel什么时候清除缓存?

Jay*_*len 4 php caching laravel eloquent laravel-5

我正在尝试使用RedisLaravel 5来缓存查询/结果,以使我的应用程序运行得更快.

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

假设我有以下内容

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

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

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

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

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

Jer*_*ris 14

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

对于喜欢Memcache或的驱动程序APC,这些服务知道如何自己"垃圾收集"并自动刷新过期的条目.

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

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

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

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

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

参考

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

编辑

像Memcache和APC一样,Redis自己处理同花顺.例如,看到这个: