在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);