Laravel 编程中,基于 Redis 多库设计,实现多种缓存仓配置

Environment

  1. Lumen 5.5
  2. Predis 1.1
  3. Redis 5.0.3

Process

1、Redis 在设计上,也保留库这个概念,一般默认库索引为0,通过命令 “select [index]” 可以切换不同的库。在根目录文件下,配置 config/database.php 多个 Redis 库。

    'redis' => [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
            'read_write_timeout' => 60,
        ],
        'db1' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 1,
            'read_write_timeout' => 60,
        ],
        'db2_usercache' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 2,
            'read_write_timeout' => 60,
        ],
    ],

2、在根目录文件下,配置 config/cache.php 多个缓存仓,分别以不同的 Redis 库作为驱动。

    'stores' => [
        'redis' => [
            'driver' => 'redis',
            'connection' => env('CACHE_REDIS_CONNECTION', 'default'),
        ],
        'redis2' => [
            'driver' => 'redis',
            'connection' => env('CACHE_REDIS2_CONNECTION', 'db2_usercache'),
        ],
    ],

3、根据不同的缓存需求,选择使用相对应的缓存仓。

    Cache::store('redis2')->remember('cappu:user:'.$apiToken, 120, function () use ( $apiToken ) {
        return DB::connection('cappu')->table('m_users')->where('api_token', $apiToken)->select('*')->first();
    });
    Cache::store('redis')->remember('cappu:goods:sku:'.$sku, 360, function () use ( $sku ) {
        return DB::connection('cappu')
            ->table('m_goods')
            ->select('*')
            ->where('sku', $sku)
            ->where('status', 1)
            ->where('is_hidden', 0)
            ->first();
    });

Conclusion

在一些开发需求情景里,会产生不同程度的缓存需求。

有一些缓存是永久性的。

有一些缓存是有时限性的,失效后会销毁。

而笔者最近遇到的情况,有一部分缓存是允许擦除的,另一部分则不允许。而且代码已经写到尾声,在方法里逐个删除释放,这是不切实际的。那最好的办法还是一次性把需要擦徐的缓存直接清空。这时候,很明显的,最好的处理办法,就是将两类缓存分开存储。

当然,这些直接用 Redis 就不用配置这么多了。只是 Laraval 已经封装好的 Cache 类库提供的方法真的很方便,就很容易信赖它了。

转载本文,请注明出处、作者。