iksaku / laravel-swr-cache
这是我的包 laravel-swr-cache
Requires
- php: ^8.1
- illuminate/contracts: ^9.0|^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0|^7.0|^8.1
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0|^8.0|^9.0
- pestphp/pest: ^1.21|^2.0
- pestphp/pest-plugin-laravel: ^1.1|^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
This package is auto-updated.
Last update: 2024-08-28 23:37:55 UTC
README
有些应用程序非常依赖缓存来提高性能,多亏了 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)。有关更多信息,请参阅 许可文件。