我正在尝试利用Redis和Laravel 5来缓存查询/结果,以使我的应用程序运行得更快。
然而,我有几个问题应该帮助我决定什么时候使用Cache,什么时候不是。
假设我有以下内容
$interview= Cache::remember('SomeUniqueKey', 180, function(){
return SurveyInterview::where('user_id', 123)
->with([
'current_step.page',
'pages'
])
->first();
});前面的代码应该缓存由雄辩者返回的集合集。总共有3个查询。首先查询模型,其次查询current_step.page关系,最后查询pages关系。
据我理解,只要我一次又一次地执行上述代码,Laravel将从缓存中返回集合,直到从缓存集合开始的180分钟结束。
问题
如果对我的数据库表进行了更新,laravel会自动删除缓存吗?在其他工作中,一旦我更新了我的SurveyInterview模型,它会删除缓存吗?还是每次更新模型时都必须手动删除?
发布于 2016-07-07 16:13:43
这个问题的答案实际上取决于所使用的缓存驱动程序。
对于像Memcache或APC这样的驱动程序,这些服务知道如何“垃圾收集”自己并自动刷新过期条目。
对于File驱动程序,它依赖于文件创建的UNIX时间戳来确定它是否过期。直到尝试检索该文件并确定它已过期,该文件才会被删除。
对于Database驱动程序,它存储一个expiration列,并可以确定它是否从该时间戳中过期。该记录在过期时不会自动删除--只有在尝试获取缓存条目并发现它已过期时(类似于文件驱动程序)。
要回答最重要的问题,remember()将继续从缓存中检索它,直到它过期,这是正确的。它通过调用特定存储类上的get()方法来做到这一点,在文件和数据库的情况下,该方法在过期时将刷新条目。当由于过期而不返回条目时,您的闭包逻辑将执行以生成一组新的数据。
据我所知,没有,当更新发生时,它不会刷新缓存。快速搜索forget或flush的照明\数据库文件夹并不表示它会这样做。尽管如此,您可以通过在模型中添加类似的内容来检测使用模型事件进行更新的时间,并让它相当容易地刷新缓存。
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一样,自己处理冲水。例如,请参见以下内容:
发布于 2016-07-07 16:20:59
您必须手动删除缓存。
在您的示例中,您可以引用SomeUniqueKey而不是survey_userid。
现在,您可以将以下事件添加到模型中,以便在更新与此缓存相关的数据时清除缓存。
public static function boot()
{
parent::boot();
static::updated(function($survey)
{
Cache::forget('survey_'. $survey->user()->id);
}
}https://stackoverflow.com/questions/38250191
复制相似问题