【问题标题】:When does Laravel clear the cache?Laravel 什么时候清除缓存?
【发布时间】:2016-07-07 16:00:43
【问题描述】:

我正在尝试将 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 模型,它会删除缓存还是每次更新模型时都必须手动删除它?

【问题讨论】:

    标签: php laravel caching laravel-5 eloquent


    【解决方案1】:

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

    对于像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 一样,自行处理刷新。例如,看这个:

    【讨论】:

    • 我正在使用的 Redis 怎么样。另外,当我使用 eloquent 更新记录时,它会刷新缓存还是我必须手动执行的操作?
    • @Jaylen 我添加了一些关于 Redis 的更多细节
    【解决方案2】:

    您必须手动删除缓存。

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

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

    public static function boot()
    {
        parent::boot();
    
        static::updated(function($survey)
        {
            Cache::forget('survey_'. $survey->user()->id);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 2013-03-20
      • 2021-04-04
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多