eusonlito / laravel-database-cache
在 Laravel 查询构建器或 Eloquent 上缓存数据库查询结果
Requires
- php: ^8.0
- illuminate/database: ^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^6.19
- phpunit/phpunit: ^9.5.8
README
Articles::latest('published_at')->take(10)->cache()->get();
要求
- PHP 8.x
- Laravel 8.x / 9.x / 10.x / 11.x
安装
您可以通过 composer 安装此包
composer require eusonlito/laravel-database-cache php artisan vendor:publish --tag=eusonlito-database-cache
将 Eusonlito\DatabaseCache\CacheBuilderTrait
添加到您的模型中
<?php declare(strict_types=1); namespace App\Models; use Illuminate\Database\Eloquent\Model; use Eusonlito\DatabaseCache\CacheBuilderTrait; class User extends Model { use CacheBuilderTrait;
配置
将以下变量添加到 .env
文件中
DATABASE_CACHE_ENABLED=true
DATABASE_CACHE_DRIVER=redis
DATABASE_CACHE_TTL=3600
DATABASE_CACHE_TAG=database
DATABASE_CACHE_PREFIX=database|
默认配置值设置在 config/database-cache.php
文件中
return [ 'enabled' => (bool)env('DATABASE_CACHE_ENABLED', env('CACHE_ENABLED', true)), 'driver' => env('DATABASE_CACHE_DRIVER', env('CACHE_DRIVER', 'redis')), 'ttl' => (int)env('DATABASE_CACHE_TTL', env('CACHE_TTL', 3600)), 'tag' => env('DATABASE_CACHE_TAG', 'database'), 'prefix' => env('DATABASE_CACHE_PREFIX', 'database|'), ];
您还可以在每个 ->cache(:ttl, :key)
调用中设置自定义的 ttl
和 key
。
用法
只需使用 cache()
方法记住在执行之前查询的结果。就是这样。该方法将自动记住结果 3600 秒。
如果您使用默认配置,此缓存将存储在 ['database', 'database|articles']
标签内。
use App\Models\Article; $articles = Article::latest('published_at')->take(10)->cache()->get();
下次您调用 相同的 查询时,结果将从缓存中检索,而不是在数据库中运行 SQL 语句,即使结果是 null
或 false
。
如果您构建了一个查询而不是执行它,
cache()
将会抛出一个错误。
生存时间
默认情况下,查询会被记住 60 秒,但您可以使用任何长度、Datetime
、DateInterval
或 Carbon 实例。
Article::latest('published_at')->take(10)->cache(now()->addHour())->get();
自定义缓存键
自动生成的缓存键是 SQL 查询及其绑定的 BASE64-MD5 哈希,这避免了与其他查询的任何冲突,同时保持了缓存键的简短。
如果您使用默认配置,此缓存将存储在 ['database', 'database|articles']
标签内,键为 latest_articles
。
Article::latest('published_at')->take(10)->cache(30, 'latest_articles')->get();
操作不是交换律的
更改构建器方法的顺序将改变自动生成的缓存键哈希。即使它们在 视觉上 相同,语句的顺序也会使哈希完全不同。
例如,给定两个在不同部分的应用程序中的相似查询,这两个都不会共享相同的缓存结果
User::whereName('Joe')->whereAge(20)->cache()->first(); User::whereAge(20)->whereName('Joe')->cache()->first();
为了确保您在相似查询上命中相同的缓存,请使用 自定义缓存键。通过这种方式,使用相同键的所有查询将共享相同的缓存结果
User::whereName('Joe')->whereAge(20)->cache(60, 'find_joe')->first(); User::whereAge(20)->whereName('Joe')->cache(60, 'find_joe')->first();
这将允许您通过直接请求缓存来检索查询之外的数据。
$joe = Cache::tags(['database', 'database|users'])->get('find_joe');
请记住,您需要传递与存储缓存时相同的有序标签列表到 tags
方法。始终在 XXX
是与查询相关的表名时使用 ['database', 'database|XXX']
。
标签
此包使用两个不同的标签进行缓存(仅支持 redis
和 memcached
)
database
是所有数据库缓存的通用标签。database|XXXX
是每个不同表的标签。表名将使用Query Builder
上的from
字符串设置。
清除缓存
您可以清除所有数据库缓存或仅清除与单个表相关的缓存
// Flush all database cache Cache::tags('database')->flush(); // Flush only users table cache Cache::tags('database|users')->flush();
许可证
MIT 许可证(MIT)。请参阅 许可证文件 以获取更多信息。