php - Laravel 什么时候清除缓存?

标签 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返回的collection set。总共有 3 个查询。第一个查询模型,第二个查询 current_step.page 关系,最后一个查询 pages 关系。

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

问题

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

最佳答案

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

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

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

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

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

据我所知,不,它不会在发生更新时刷新缓存。在 Illuminate\Database 文件夹中快速搜索 forgetflush 并不表示它会这样做。也就是说,您可以使用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/

相关文章:

php - jquery.post() 和 php

php - 如果特定型号不在\App 中,则无法找到该型号

Laravel Eloquent 查询模型,在 n 到 m 关系中具有精确的多个关联

java - 在java中同时使多个worker的缓存无效而不影响性能

php - 用户离开页面后 php 执行是否停止?

php - 错误消息 "Strict standards: Only variables should be passed by reference"

algorithm - LRU缓存算法的复杂度

caching - 没有过期的 header 发送,内容被缓存,浏览器发出条件GET请求之前需要多长时间?

php - 将 IP 地址与 IPv6 block 进行比较

mysql - eloquent,用外表数据检索用户数据