musoftware / rememberable
Laravel 的查询缓存
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.0
- illuminate/support: ^8.0
README
Rememberable 是 Laravel 的一个 Eloquent 特性,它添加了 remember()
查询方法。这使得您能够轻松地将查询结果缓存一定时间。
// Get a the first user's posts and remember them for a day. User::first()->remember(now()->addDay())->posts()->get(); // You can also pass the number of seconds if you like (before Laravel 5.8 this will be interpreted as minutes). User::first()->remember(60 * 60 * 24)->posts()->get();
它通过简单地记住使用的 SQL 查询并将结果存储起来来实现。如果在缓存持久期间尝试执行相同的查询,它将直接从存储中检索,而不是再次击中数据库。
安装
使用 Composer 安装,就像安装任何其他内容一样。
composer require watson/rememberable
要开始使用 Eloquent,最简单的方法是创建一个抽象的 App\Model
,您可以从中扩展应用程序模型。在这个基本模型中,您可以导入可记忆的特性,这将扩展任何基于模型的查询的相同缓存功能。
<?php namespace App; use Watson\Rememberable\Rememberable; use Illuminate\Database\Eloquent\Model as Eloquent; abstract class Model extends Eloquent { use Rememberable; }
现在,只需确保使用这个新的 App\Model
替代 Eloquent 的应用程序模型。
<?php namespace App; class Post extends Model { // }
或者,您可以直接将特性应用于希望使用 remember()
的每个模型。
用法
使用 remember 方法非常简单。只需传递您希望将查询结果存储在缓存中的秒数,在此时间段内,如果调用相同的查询,结果将直接从缓存中获取,而不是再次从数据库中获取。
// Remember the number of users for an hour. $users = User::remember(60 * 60)->count();
缓存标签
如果您想对某些查询进行标记,可以在查询中添加 cacheTags('tag_name')
。请注意,并非所有缓存驱动程序都支持缓存标签。
// Remember the number of users for an hour and tag it with 'user_queries' User::remember(60 * 60)->cacheTags('user_queries')->count();
缓存前缀
如果您希望为每个查询添加唯一的缓存键前缀(例如,如果您的缓存不支持标记),可以在查询中添加 prefix('prefix')
。
// Remember the number of users for an hour and prefix the key with 'users' User::remember(60 * 60)->prefix('users')->count();
或者,您可以将 $rememberCachePrefix
属性添加到模型中,以始终使用该缓存前缀。
缓存驱动程序
如果您想使用自定义缓存驱动程序(在 config/cache.php 中定义),可以在查询中添加 cacheDriver('cacheDriver')
。
// Remember the number of users for an hour using redis as cache driver User::remember(60 * 60)->cacheDriver('redis')->count();
或者,您可以将 $rememberCacheDriver
属性添加到模型中,以始终使用该缓存驱动程序。
模型级缓存标签
您可以通过设置 $rememberCacheTag
属性来为模型的每个查询设置缓存标签,该属性是用于标记查询的唯一字符串。
关系
验证通过基于查询的缓存查询来实现。这意味着,当您执行预加载时,除非明确指定,否则不会缓存额外的查询。您可以通过使用回调来实现这一点。
$users = User::where("id", ">", "1") ->with(['posts' => function ($q) { $q->remember(60 * 60); }]) ->remember(60 * 60) ->take(5) ->get();
始终启用
您可以通过将 $rememberFor
属性设置为要缓存结果的秒数来选择缓存模型的所有查询。谨慎使用此功能,因为它可能导致您不熟悉其工作方式时,应用程序中出现意外的行为和过时的数据。
缓存刷新
根据软件包的架构,无法删除单个查询的缓存。但如果你使用缓存标签标记了任何查询,你可以刷新该标签的缓存。
User::flushCache('user_queries');
如果您使用了 $rememberCacheTag
属性,您可以使用不带参数的方法,刷新 $rememberCacheTag
设置的标签缓存。
User::flushCache();
跳过缓存
如果您需要禁用特定查询的缓存,可以使用 dontRemember
方法。
User::latest()->dontRemember()->get();