基础知识
- 缓存顾名思义就是将数据保存起来,下次要使用时直接获取即可。程序中用的最多的就是将数据库的数据进行缓存从而减少查询数据库的次数,减轻服务器压力。
- yii2框架默认使用的是文件缓存,本文将介绍redis缓存的使用,因此需要安装yii的redis扩展,传送门
1.首先进行配置,使我们的项目以redis作为缓存:
[
'components' => [
'cache' => [
'class' => 'yii\redis\Cache',
'redis' => [
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
]
],
],
]
2.首先介绍一种常见的缓存方式:先判断在redis中对应key有没有值,如果存在就返回,如果不存在就从数据库中查询得到结果,并将结果缓存并返回。
//实例代码:先判断redis中是否存在key为cates的值,如果存在就直接使用
//如果不存在,就从数据库中查询得到结果并存入缓存
if(!$cates=\Yii::$app->cache->get('cates')){
$cates = $category->getCategorys();
\Yii::$app->cache->set('cates',$cates,\Yii::$app->params['redis_cache_expire']);
}
\Yii::$app->view->params['cates']=$cates;
//这里需要注意:当数据量比较少时,通过yii的debug工具你会发现使用了缓存之后,系统执行的时间并没有
//减少多少或者时间更长了,这仅仅是因为数据量少的原因,当数据量多的时候,缓存的优势才会很明显
3.其次介绍缓存依赖,首先我们要明确缓存依赖是什么?缓存依赖是除了缓存的有效时间之外另一个决定缓存是否有效的因素,yii2框架支持的缓存依赖有哪些呢?点我查看,本文主要讲解db依赖的使用方法:
//使用缓存依赖的小例子
if(!$cart=\Yii::$app->cache->get('cart')){
$cart = $query->limit($pager->limit)->offset($pager->offset)->all();
$dp=new \yii\caching\DbDependency([
'sql'=>'select max(update_time) from {{%cart}} where uid=:uid',
'params'=>[':uid'=>\Yii::$app->session['user']['uid']]
]);
\Yii::$app->cache->set('cart',$cart,\Yii::$app->params['redis_cache_expire'],$dp);
}
//当sql查询出来的update_time的最大值发生变化时,即时有效期没有过,缓存也失效。如果update_time的最大值没有
//发生变化,那么缓存有效期过了就失效
4.最后介绍查询缓存的使用,查询缓存简单地理解就是以当前查询的sql语句为key缓存查询结果:
#查询缓存的小例子
$goods=Goods::getDb()->cache(function(){
return Goods::find()->where(['status'=>1,'is_hot'=>1])->all();
},2*60*60,$dep);
#参数dep的值是当前查询缓存的依赖
#2*60*60是当前查询缓存的有效期,如果不填写,则有效期为数据库连接类的成员属性$queryCacheDuration的值
#关于数据库连接类yii\db\Connection的几个成员属性的介绍,因为它们的值直接关系到查询缓存:
#public $enableQueryCache = true; 是否启用查询缓存,默认是true
#public $queryCacheDuration = 3600; 如何不指定缓存的有效期,那么默认是3600秒
#public $queryCache = 'cache'; 查询缓存所使用的缓存组件,基于本文的设置,缓存最终会存在redis中
#以上值都可以在db.php配置文件中进行个性化配置
|