您现在的位置是:网站首页 > PHP>Laravel 数据查询缓存--watson/rememberable
Laravel 数据查询缓存--watson/rememberable
- PHP
- 2018-12-24
- 496人已阅读
数据查缓存适当的增加可以有效的缓解服务器压力,在现在系统开发中是很有必要的技术解决方案,watson/rememberable 就是这样一个可以方便 Eloquent 模型缓存的扩展包。
场景分析
IT学无止境 首页底部 网站版权 就用到了缓存。
查询时使用 $setting->getFirstCached(); 获取数据,getFirstCached(); 方法实现如下:
app/Models/Setting.php
.
.
.
public function getFirstCached()
{
// 尝试从缓存中取出 cache_key 对应的数据。如果能取到,便直接返回数据。
// 否则运行匿名函数中的代码来取出活跃用户数据,返回的同时做了缓存。
return Cache::remember($this->cache_key, $this->cache_expire_in_minutes, function(){
return $this->where('id',1)->first();
});
}
.
.
.
通常情况下我们都会使用 Cache::remember 方法来缓存数据,下面是使用 watson/rememberable 流程及方法,将会在使用缓存时更加简单。
安装
$ composer require watson/rememberable
使用
首先需要让模型使用 Watson\Rememberable\Rememberable 这个 Trait, app\Models\Model.php 是一个抽象的基础模型,我们可以将 Trait 加到这个模型中,其他模型只需要继承 Model 即可使用缓存相关的功能了。
app/Models/Model.php
namespace App\Models;
use Watson\Rememberable\Rememberable;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Model extends EloquentModel
{
use Rememberable;
.
.
.
这样项目中的模型中要继承了 app/Models/Model.php 就都可以使用 watson/rememberable 中的方法了。
我们可以在查询的时候直接使用 remember 方法来代替 Cache::remember 方法。
app/Models/Setting.php
namespace App\Models;
class Setting extends Model
{
public function getFirstCached()
{
return $this->remember($this->cache_expire_in_minutes)->where('id',1)->first();
}
.
.
.
Cache:remember 的第一个参数是一个 key , 方便获取缓存以及删除缓存,而 watson/rememberable 提供的remember 方法会将查询语句的哈希值作为默认的 key , 所以不用传入 key 也是能正常工作的。
不过在一些特定的条件下我们还是需要将缓存清除,现在的做法是在观察器中当模型保存的时候触发 saved 事件时将相关缓存清除,代码如下:
app/Observers/SettingObserver
.
.
.
class SettingObserver
{
// 在保存后清空 cache_key 对应的缓存
public function saved(Setting $setting)
{
Cache::forget($setting->cache_key);
}
}
所以我们还是需要指定一个 key 方便删除缓存, watson/rememberable 为模型提供了 $rememberCacheTag 属性,该属性会为该模型所有的缓存添加标签(tag)。不过并不是所有的缓存驱动都支持标签功能,需要先将 .env 中的 CACHE_DRIVER 设置为 redis。
.env
.
.
.
CACHE_DRIVER=redis
.
.
.
将原有的属性 $cache_key 修改为 $rememberCacheTag 即可。
app/Models/Setting.php
//public $cache_key = 'itxwzj_config';
protected $rememberCacheTag = 'itxwzj_config';
protected $cache_expire_in_minutes = 1440;
public function getFirstCached()
{
return $this->remember($this->cache_expire_in_minutes)->where('id',1)->first();
}
直接使用 flushCache() 方法即可清除 $rememberCacheTag 相关的所有缓存,修改 SettingObserver :
app/Observers/SettingObserver.php
.
.
.
class SettingObserver
{
// 在保存后清空对应的缓存
public function saved(Setting $setting)
{
$setting->flushCache();
}
}
到这里基本就完成了,这时将会使用缓存的数据查询显示。
最新评论
站长大王来回复你了,长点心吧!