eusonlito/laravel-database-cache

在 Laravel 查询构建器或 Eloquent 上缓存数据库查询结果

0.0.6 2024-04-16 10:38 UTC

This package is auto-updated.

Last update: 2024-09-16 11:43:37 UTC


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) 调用中设置自定义的 ttlkey

用法

只需使用 cache() 方法记住在执行之前查询的结果。就是这样。该方法将自动记住结果 3600 秒。

如果您使用默认配置,此缓存将存储在 ['database', 'database|articles'] 标签内。

use App\Models\Article;

$articles = Article::latest('published_at')->take(10)->cache()->get();

下次您调用 相同的 查询时,结果将从缓存中检索,而不是在数据库中运行 SQL 语句,即使结果是 nullfalse

如果您构建了一个查询而不是执行它,cache() 将会抛出一个错误。

生存时间

默认情况下,查询会被记住 60 秒,但您可以使用任何长度、DatetimeDateInterval 或 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']

标签

此包使用两个不同的标签进行缓存(仅支持 redismemcached

  • 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)。请参阅 许可证文件 以获取更多信息。