繁体   English   中英

Laravel永久缓存*可能*过期

[英]Laravel Cache Forever with *Possible* Expiry

我需要从外部API缓存返回的数据,听起来很简单,但是...

我想用到期日期缓存数据。 我不希望缓存在该日期到期,我想尝试重新请求数据,如果成功,则覆盖旧数据。 如果重新请求未成功,则应保留旧数据。

基本上,我需要Cache::forever(); 带有到期日期或一些自定义代码。

您可以轻松地将自己的方法添加为宏:

Cache::macro('untilUpdated', function ($key, $date, Closure $callback)
{
    if ( ! $date instanceof DateTime)
    {
        $date = Carbon::now()->addMinutes($date);
    }

    if (is_null($value = Cache::get($key)))
    {
        $data = $callback();

        Cache::forever($key, compact('date', 'data'));

        return $data;
    }

    if ($value['date'] >= $date && ($data = $callback()) !== false)
    {
        Cache::forever($key, compact('date', 'data'));

        return $data;
    }

    return $value['data'];
});

然后像下面这样使用您的代码:

$value = Cache::untilUpdated('key', 10, function ()
{
    return API::call() ?: false;
});

这是一种非常有用的模式,但不是许多缓存支持的模式,大多数将在到期日期硬失效(删除)缓存条目。

实现自己非常简单,您需要做的就是向API响应对象添加一个到期日期字段,填充它,然后使用Cache::forever()存储响应。 当您从缓存中检索响应时,请检查有效日期,如果有效日期已过,请尝试加载和缓存新数据,或者回退以返回陈旧的副本。

您可能想在响应中添加另一个字段-上次尝试刷新它的日期。 然后,您可以使用它在新的尝试刷新数据之间等待一段时间,如果API没有响应,这将很方便。 否则,过期后每次对缓存数据的调用都会浪费时间进行API调用。

您可以选择更复杂的模式,创建自己的新外观,以包装Laravel的Cache外观,并提供类似的方法。 特别是,您可以编写自己的rememberForever方法实现,以便在每次对缓存的调用中传递一个函数,该函数将在响应丢失或过时时发出API请求。 由于我不知道如何进行API查询,因此无法提供示例,但无论如何,第一种选择可能会更简单!

将下一个更新日期存储在Cache::forever('your_key')使用一种用于检查新数据的简单方法来更新Cache::forever('your_key')的内容。

function checkForUpdates()
{
    $date = time();

    if (Cache::has('my_key'))
    {
        if ($date >= $date_from_db)
        {
            $data = $this->getUpdatedData();

            if ($data !== Cache::get('my_key'))
            {
                Cache::forever('my_key', $data)
            }
        }
    }
    else
    {
        Cache::forever('my_key', $this->getData());

        MyDateModel::insert(['next_update' => date('d-m-Y H:i:s', strtotime('+1 week'))]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM