首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉勒维尔什么时候才能清空缓存?

拉勒维尔什么时候才能清空缓存?
EN

Stack Overflow用户
提问于 2016-07-07 16:00:43
回答 2查看 6.8K关注 0票数 7

我正在尝试利用Redis和Laravel 5来缓存查询/结果,以使我的应用程序运行得更快。

然而,我有几个问题应该帮助我决定什么时候使用Cache,什么时候不是。

假设我有以下内容

代码语言:javascript
复制
$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模型,它会删除缓存吗?还是每次更新模型时都必须手动删除?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 16:13:43

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

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

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

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

要回答最重要的问题,remember()将继续从缓存中检索它,直到它过期,这是正确的。它通过调用特定存储类上的get()方法来做到这一点,在文件和数据库的情况下,该方法在过期时将刷新条目。当由于过期而不返回条目时,您的闭包逻辑将执行以生成一组新的数据。

据我所知,没有,当更新发生时,它不会刷新缓存。快速搜索forgetflush的照明\数据库文件夹并不表示它会这样做。尽管如此,您可以通过在模型中添加类似的内容来检测使用模型事件进行更新的时间,并让它相当容易地刷新缓存。

代码语言:javascript
复制
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一样,自己处理冲水。例如,请参见以下内容:

票数 17
EN

Stack Overflow用户

发布于 2016-07-07 16:20:59

您必须手动删除缓存。

在您的示例中,您可以引用SomeUniqueKey而不是survey_userid

现在,您可以将以下事件添加到模型中,以便在更新与此缓存相关的数据时清除缓存。

代码语言:javascript
复制
public static function boot()
{
    parent::boot();

    static::updated(function($survey)
    {
        Cache::forget('survey_'. $survey->user()->id);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38250191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档