iksaku/laravel-swr-cache

这是我的包 laravel-swr-cache

1.0.2 2024-03-23 21:05 UTC

This package is auto-updated.

Last update: 2024-08-28 23:37:55 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

有些应用程序非常依赖缓存来提高性能,多亏了 Laravel 的 cache()->remember() 方法,我们可以轻松地将回调函数的结果缓存起来,给定一个存活时间(TTL)。

然而,有时候回调函数可能需要很长时间才能执行,我们不想在给出响应之前等待它完成。

这就是 Stale-While-Revalidate 模式派上用场的地方。它允许我们立即返回缓存的结果,然后在后台执行回调以更新下一次请求的缓存。

SWR 在底层是如何工作的?

安装

您可以通过 composer 安装此包

composer require iksaku/laravel-swr-cache

使用方法

swr() 方法是围绕 cache()->remember() 的包装器,它通过使用新的 Time-To-Stale 参数(TTS)添加对 Stale-While-Revalidate 模式的支持。您可以使用 cache() 辅助函数访问此方法

$stats = cache()->swr(
    key: 'stats',
    ttl: now()->addHour(),
    tts: now()->addMinutes(15),
    callback: function () {
        // This may take a couple of seconds...
    }
);

// ...

或者使用 Cache 门面

$stats = \Illuminate\Support\Facades\Cache::swr(
    key: 'stats',
    ttl: now()->addHour(),
    tts: now()->addMinutes(15),
    callback: function () {
        // This may take a couple of seconds...
    }
);

// ...

remember() 方法类似,如果缓存中没有值,则执行回调,并将结果缓存给定存活时间,相应的 Time-To-Stale 也会被存储。

如果值可用且 Time-To-Stale 未经过,则认为值是 新鲜的,将立即返回。不会执行回调。

如果 Time-To-Stale 已经经过,则认为值是 过时的,将立即返回,并在将响应发送给用户后执行回调。

技巧

Mohamed Said 有关于此的精彩文章。查看: 在响应发送后运行任务.

队列回调执行

如果您希望将回调执行队列化而不是在响应发送后执行,可以使用 queue 参数

$stats = cache()->swr(
    key: 'stats',
    ttl: now()->addHour(),
    tts: now()->addMinutes(15),
    callback: function () {
        // This may take more than a couple of seconds...
    },
    queue: true
);

并且,如果您想进一步自定义队列作业,可以传递一个接受 Illuminate\Foundation\Bus\PendingClosureDispatch 类型的参数的闭包

use Illuminate/Foundation/Bus/PendingClosureDispatch;

$stats = cache()->swr(
    key: 'stats',
    ttl: now()->addHour(),
    tts: now()->addMinutes(15),
    callback: function () {
        // This may take more than a couple of seconds...
    },
    queue: function (PendingClosureDispatch $job) {
        $job->onQueue('high-priority')
    }
);

测试

composer test

变更日志

请参阅 变更日志 了解最近更改的详细信息。

贡献

请参阅 贡献指南 了解详细信息。

安全漏洞

请查看 我们的安全策略 了解如何报告安全漏洞。

致谢

许可

MIT 许可证(MIT)。有关更多信息,请参阅 许可文件