adamcrampton/object-cache

Laravel 的 Redis 对象缓存

v4.2.6 2020-07-01 05:33 UTC

README

这个 Laravel 扩展包允许你在 Redis 缓存中设置和忘记对象,带有自动化的 Middleware 和方便的预打包 TTL 设置。你所需要提供的只是 TTL、键名和用于重新生成值的方法的名称。

从 v3.x.x 升级

如果你是从 v3 版本升级,你需要对你的实现进行以下修改

  • 创建一个 PHP 类来存储你的方法和方法配置,并将 $this->objects 数组和你的缓存方法迁移到新类中。确保将任何依赖迁移到新类。
  • methodClass 键添加到 config/object_cache.php 文件中,并将该值设置为你在上一步中创建的完全命名空间类的名称。
  • 删除你的对象缓存 Middleware。
  • app/Http/Kernel.php 中的 Middleware 设置更改为使用包的 Middleware:\AdamCrampton\ObjectCache\Middleware\CheckObjectCache::class
  • 请参阅下面的配置部分以获取你可能没有设置的附加配置选项。

安装

  • 在你的项目目录中运行 composer require adamcrampton/object-cache
  • 将库服务提供者 AdamCrampton\ObjectCache\ObjectCacheServiceProvider::class 和外观 'ObjectCache' => AdamCrampton\ObjectCache\ObjectCacheFacade::class 添加到 config/app.php
  • 为存储你的方法创建一个类,并添加 use AdamCrampton\ObjectCache\ObjectCache 的使用语句
  • 将包的 Middleware \AdamCrampton\ObjectCache\Middleware\CheckObjectCache::class 添加到 app/Http/Kernel.php
  • 配置你的路由以使用 Middleware - 查看 https://laravel.net.cn/docs/5.8/middleware#assigning-middleware-to-routes
  • 运行 php artisan vendor:publish - 这将在你的项目配置目录中添加一个 object_cache.php 文件
  • 将 Redis 主机添加到 .env 文件中(本地开发时使用 localhost - 确保你的环境已安装 Redis)

配置

配置可以在发布的 config/object_cache.php 文件中找到。

  • 编辑 Redis 连接的 parametersoptions 值 - 查看 https://github.com/nrk/predis/wiki/Connection-Parameters
  • 将具有完全命名空间的类名称添加到 methodClass 键中
  • fallback 下的设置与获取助手(详情见下文)相关。如果你希望库在 Redis 获取失败时手动获取数据,请将此设置为 true。passRequest 选项强制助手将请求对象传递到你的缓存方法类构造函数(仅当此选项对你的应用程序是必需时设置为 true)
  • logErrors 设置为 true 将启用获取助手记录从 Redis 获取值和/或回退尝试的任何失败尝试

用法

初始化连接

  • 在类中添加 use AdamCrampton\ObjectCache\ObjectCache
  • 声明一个用于连接的变量,例如 $redis = ObjectCache::init()

初始化后,你可以使用所有 Predis 命令。请参阅

Middleware

与包一起提供的CheckObjectCache中间件允许您添加要在每次请求上自动检查的缓存对象,如果缺失则设置。您需要添加一个$this->objects数组(配置)以及每个对应的缓存存储类方法(如安装中所述)。

$this->objects数组中的每个条目都需要3个值的数组。它们是

  • cacheKey: Redis存储中对象的键名。
  • cacheTtl: 使用预定义的命名TTL(见下文),或以秒为单位的TTL。
  • cacheMethod: 如果未找到(即缺失或过期)时,重新生成缓存数据的名称(方法)。

使用缓存存储类的实现示例


use App\Models\PartPrice;
use AdamCrampton\ObjectCache\ObjectCache;

class CacheMethodStore
{
    public $objects;
    
    public function __construct()
    {   
        $this->objectCache = new ObjectCache();
        
        $this->objects = [
            [
                'cacheKey' => 'exampleKey',
                'cacheTtl' => $this->objectCache->ttl['hours']['twentyFour'],
                'cacheMethod' => 'setExample'
            ]
        ];
    }

    public function setExample()
    {
        return PartPrice::select(['part_id', 'price'])
            ->get()
            ->toJson();
    }
}

获取助手

初始化后,您可以使用提供的助手从缓存中获取对象。您需要传入的两个参数是键和JSON解码选项。

如果您传入解码选项,请将其设置为'true'或'object'以获得正确的返回格式。示例

    /**
     * Fetch part data for the front end.
     *
     * @return array
     */
    protected function buildPartData(Request $request)
    {
        return ObjectCache::get('dealer_123456_part_data', 'array');
    }

预配置TTL

包中包含了一个方便的TTL值数组。要使用其中一个值,请按照上述方法初始化Redis连接,并使用适当的键名调用ttl属性。此TTL数组的结构如下

    'default' => [
        'default' => 86400
    ],
    'apc' => [
        'default' => 86400
    ],
    'array' => [
        'default' => 86400
    ],
    'database' => [
        'default' => 86400
    ],
    'file' => [
        'default' => 86400
    ],
    'memcached' => [
        'default' => 86400
    ],
    'redis' => [
        'default' => 86400
    ],
    'minutes' => [
        'one' => 60,
        'five' => 300,
        'ten' => 600,
        'fifteen' => 900,
        'twenty' => 1200,
        'thirty' => 1800,
        'forty' => 2400,
        'fortyFive' => 2700,
        'fifty' => 3000,
        'sixty' => 3600
    ],
    'hours' => [
        'one' => 3600,
        'two' => 7200,
        'three' => 10800,
        'four' => 14400,
        'five' => 18000,
        'six' => 21600,
        'seven' => 25200,
        'eight' => 28800,
        'nine' => 32400,
        'ten' => 36000,
        'eleven' => 39600,
        'twelve' => 43200,
        'twentyFour' => 86400
    ],
    'days' => [
        'one' => 86400,
        'two' => 172800,
        'three' => 259200,
        'four' => 345600,
        'five' => 432000,
        'six' => 518400,
        'seven' => 604800,
        'fourteen' => 1209600,
        'twentyEight' => 2419200
    ],
    'weeks' => [
        'one' => 604800,
        'two' => 1209600,
        'three' => 1814400,
        'four' => 2419200,
        'five' => 3024000,
        'six' => 3628800
    ]
];