我正在尝试将 Redis
与 Laravel 5 结合使用来缓存查询/结果,以使我的应用程序运行得更快。
但是,我有几个问题可以帮助我决定何时适合使用 Cache
以及何时不适合。
假设我有以下内容
$interview= Cache::remember('SomeUniqueKey', 180, function(){
return SurveyInterview::where('user_id', 123)
->with([
'current_step.page',
'pages'
])
->first();
});
前面的代码应该缓存eloquent返回的collection set。总共有 3 个查询。第一个查询模型,第二个查询 current_step.page
关系,最后一个查询 pages
关系。
据我了解,只要反复执行上面的代码,Laravel 就会从缓存中返回集合,直到集合被缓存到 180 分钟。
问题
如果我的数据库表发生更新,laravel 会自动删除缓存吗?在其他工作中,它会在我更新我的 SurveyInterview
模型后删除缓存,还是我每次更新模型时都必须手动删除缓存?
最佳答案
这个问题的答案实际上取决于所使用的缓存驱动程序。
对于像 Memcache
或 APC
这样的驱动程序,这些服务知道如何“收集垃圾”并自动刷新过期的条目。
对于 File
驱动程序,它依赖于文件创建的 UNIX 时间戳来确定它是否已过期。文件不会被删除,直到尝试检索它并确定它已过期
对于 Database
驱动程序,它存储了一个 expiration
列,并且可以确定它是否从该时间戳记起过期。记录不会在过期时自动删除——仅当尝试获取缓存条目时发现它已过期(类似于文件驱动程序)。
要回答首要问题,您是正确的,remember()
将继续从缓存中检索它,直到它过期。它通过在特定存储类上调用 get()
方法来实现这一点,对于文件和数据库,如果过期自动刷新条目。当它因过期而未返回任何条目时,您的关闭逻辑将执行以生成一组新数据。
据我所知,不,它不会在发生更新时刷新缓存。在 Illuminate\Database 文件夹中快速搜索 forget
或 flush
并不表示它会这样做。也就是说,您可以使用model events 检测更新何时发生。并通过向模型中添加类似这样的内容,让它相当轻松地刷新缓存。
public static function boot()
{
SurveyInterview::updated(function ($survey) {
app('cache')->forget('my-survey-key-' . $survey->id);
});
}
引用资料
文件存储: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Cache/FileStore.php
数据库存储:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Cache/DatabaseStore.php#L66
编辑
Redis 与 Memcache 和 APC 一样,自行处理刷新。例如,看这个:
关于php - Laravel 什么时候清除缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250191/