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 的最简单方法是创建一个抽象的AppModel
,您可以从中扩展您的应用程序模型。在此基本模型中,您可以导入可记住的特征,它将相同的缓存功能扩展到您基于模型构建的任何查询。
<?php
namespace App ;
use Watson Rememberable Rememberable ;
use Illuminate Database Eloquent Model as Eloquent ;
abstract class Model extends Eloquent
{
use Rememberable;
}
现在,只需确保您的应用程序模型来自这个新的AppModel
而不是 Eloquent。
<?php
namespace App ;
class Post extends Model
{
//
}
或者,您可以简单地将特征应用于您希望使用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 ();