我正在尝试将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
模型后删除缓存,还是每次更新模型时都必须手动删除缓存?
答案 0 :(得分:10)
这个问题的答案实际上取决于正在使用的缓存驱动程序。
对于像Memcache
或APC
这样的驱动程序,这些服务知道如何"垃圾收集"他们自己并自动刷新过期的条目。
对于File
驱动程序,它依赖于文件创建的UNIX时间戳来确定它是否已过期。在尝试检索文件并确定已过期之前,不会删除该文件
对于Database
驱动程序,它会存储expiration
列,并可以确定该时间戳的过期方式。该记录在到期时不会自动删除 - 仅当尝试获取缓存条目并且发现它已过期时(类似于文件驱动程序)。
要回答这个首要问题,您是正确的remember()
将继续从缓存中检索它,直到它过期。它通过在特定存储类上调用get()
方法来实现,在文件和数据库的情况下,如果自动过期,则会刷新条目。当它由于到期而没有返回任何条目时,您的闭包逻辑将执行以生成一组新数据。
据我所知,不,它不会在发生更新时刷新缓存。快速搜索forget
或flush
的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);
}
}