quietasice / rememberable
Laravel 5 的查询缓存
Requires
- php: >=5.4.0
- illuminate/database: ~5.0
- illuminate/support: ~5.0
Requires (Dev)
- mockery/mockery: 0.9.*
- phpunit/phpunit: 4.2.*
README
Rememberable 是一个用于 Laravel 5.0+ 的 Eloquent 特性,它重新引入了 Laravel 4.2 的 remember()
查询功能。这使得缓存查询结果变得非常简单。
// Get a the first user's posts and remember them for a day. User::first()->remember(1440)->posts()->get();
它通过简单地记住所使用的 SQL 查询并存储结果来实现。如果在缓存持久期间尝试执行相同的查询,它将从存储中检索,而不是再次击中数据库。
安装
使用 Composer 安装,就像安装其他任何东西一样。
composer require watson/rememberable
开始使用 Eloquent 的最简单方法是通过创建一个抽象的 App\Model
,你可以从中扩展你的应用程序模型。在这个基础模型中,你可以导入 rememberable 特性,这将把相同的缓存功能扩展到任何基于模型构建的查询。
<?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)->count();
缓存标签
如果你想要标记某些查询,可以在查询中添加 cacheTags('tag_name')
。请注意,并非所有缓存驱动程序都支持缓存标签。
// Remember the number of users for an hour and tag it with 'user_queries' User::remember(60)->cacheTags('user_queries')->count();
缓存前缀
如果你想要为每个查询添加一个唯一的缓存键前缀(比如,如果你的缓存不支持标记),你可以在查询中添加 prefix('prefix')
。
// Remember the number of users for an hour and prefix the key with 'users' User::remember(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)->cacheDriver('redis')->count();
或者,你可以将 $rememberCacheDriver
属性添加到你的模型中,以始终使用该缓存驱动程序。
模型全局缓存标签
你可以通过设置 $rememberCacheTag
属性为用于标记查询的唯一字符串来为模型的全部查询设置缓存标签。
关系
验证通过按查询缓存查询来实现。这意味着当你执行预加载时,除非明确指定,否则那些额外的查询不会缓存。你可以通过使用回调函数来做到这一点。
$users = User::where("id", ">", "1") ->with(['posts' => function ($q) { $q->remember(10); }]) ->remember(10) ->take(5) ->get();
始终启用
你可以选择通过设置 $rememberFor
属性为想要缓存结果的分钟数来缓存模型的全部查询。请谨慎使用此功能,因为它可能导致不熟悉如何工作的意外行为和应用程序中的过时数据。
缓存刷新
根据包的架构,无法删除单个查询的缓存。但是,如果你使用缓存标签标记了任何查询,你可以刷新该标签的缓存。
User::flushCache('user_queries');
如果你使用了 $rememberCacheTag
属性,你可以使用不带参数的方法,刷新由 $rememberCacheTag
设置的标签的缓存。
User::flushCache();
跳过缓存
如果您需要禁用特定查询的缓存,可以使用 dontRemember
方法
User::latest()->dontRemember()->get();