在Docker Compose上使用Laravel进行Redis缓存

Redis的安装设置

composer require predis/predisする

docker-compose.yamlにRedisを足す。yamlファイルはインテンドの高さを間違えると動かないので注意。

redis:
    image: redis
    ports:
      - 6379:6379

config/database.phpのRedisクライアントをpredisに変更

//前略
    'redis' => [
        'client' => env('REDIS_CLIENT', 'predis'),
//後略

.envでキャッシュドライバとホストを変更

CACHE_DRIVER=redis
REDIS_HOST=redis

暂时可以确认Redis已经运行成功。

在控制器中使用缓存

首先考虑将Product::all()的结果进行缓存。

    • すでにキャッシュがあればそこからデータを取り出す

 

    ない場合はProduct::all()のクエリを走らせ、結果をキャッシュする

将执行这个处理。

public function frontend(){
         if($products = \Cache::get('products_frontend')){
             return $products;
         }

         $products = Product::all();
        \Cache::set('products_frontend',$products,30*60);
         return $products;
   }

使用Cache::get($cache_name)函数可以调用缓存。这很简洁。而Cache::set()函数的第一个参数是缓存名称,第二个参数是要缓存的数据,第三个参数是缓存时间(以秒为单位)。
另外,通过在门面模式前加上反斜杠,可以调用类。

使用\Cache::remember函数可以在一行代码中实现上述处理。

$products = \Cache::remember('products_frontend',30*60,fn()=>Product::all());
return $products;

我想通过活动清除缓存!

当我们把$products缓存起来后,无论是更新、创建还是删除商品,当进行获取操作时,我们都会从缓存中拉取数据,导致信息无法更新的问题存在。
换句话说,如果要进行更新、创建、删除操作,我们需要清除缓存。

    public function deleteCache(){
        \Cache::forget('products_frontend');
    }

虽然可以通过做这个来解决,但我们可以通过活动的方式来解决这个问题。

首先,创建 php artisan make:event ProductUpdatedEvent 和 php artisan make:listener ProductUpdatedListener。
然后,在 EventServiceProvider 中注册这两个事件。

protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        ProductUpdatedEvent::class=>[
            ProductUpdatedListener::class
        ]
    ];

这样,ProductUpdatedListener将作为ProductUpdatedEvent的监听器被注册。

嗯,关于ProductUpdatedEvent的代码,由于这次只需要触发事件,所以可以删除大部分代码。

class ProductUpdatedEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
}

然后在监听器内写入所需的处理。

class ProductUpdatedListener
{
    public function handle( ProductUpdatedEvent $event)
    {
        \Cache::forget('products_frontend');
        \Cache::forget('products_backend');
    }
}

一旦ProductUpdatedEvent在应用程序的某处触发后,将会执行监听器内的缓存清除处理。最后,在控制器中需要的位置,使用以下代码触发事件。

event(new ProductUpdatedEvent);
广告
将在 10 秒后关闭
bannerAds