YII缓存依赖的应用

缓存
缓存依赖
Yii

缓存是提升Web应用性能的简便有效的方式。当我们在加载网页需要过多的时间,比如说查询时间过久,抑或是调用接口占用过多I/O,建立缓存是一个行之有效的方法,它可以避免多次加载页面缓慢的不良用户体验。但是网页中数据并不是一成不变的,它是变化的,就如查询有不同条件不同内容,所以我们缓存的内容也要随之变化,这就是缓存依赖所存在的必要性。

设置缓存

一般情况下,我们会给缓存的变量设置过期时间,到了过期时间,该变量也就随之有效,下次加载就必须重新生成缓存,这就是一种依赖条件,设置过期时间。

// 变量将在30秒后失效
Yii::app()->cache->set($id, $value, 30 ) ;        

而缓存依赖的条件不会只是这么单一,它可以依赖文件内容、数据库、表达式、php中的全局变量。

YII使用缓存依赖

上述是我在工作中的理解,相信大家有过做静态页面的也会有这种因变而变的方式。下面描述具体的实现(在这里提及下我用的是Yii1.1):

1、在应用config文件components(组件配置) 加入缓存组件.

'components'=>array(                  
...                   
'cache' => array (                                            
'class' => 'system.caching.CFileCache',  #方式 文件缓存 缓存方式有 [CMemCache]: 使用 PHP memcache 扩展.[CApcCache]: 使用 PHP APC 扩展.等等,具体参考Yii社区文档。                                                             
'directoryLevel' => 2,                                                              
),                   
...
)

2、使用缓存依赖条件

  • 依赖文件

#依赖文件
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));

依赖文件也很容易理解,比如说程序中会出现对城市的配置存贮文件,可能某个城市或是下级出现多个区,这个文件就会发生改变了,那缓存的这个数据就应该根据依赖条件过期,重新生成这个缓存文件。使用方法可以灵活运用:

if(!Yii::app()->cache->get('city')){
Yii::app()->cache->set('city', include('path/city.php'), 30, new CFileCacheDependency('path/city.php'));
}
//todo:执行操作
  • 依赖SQL
    用的广泛的应该是SQL数据的查询依赖

#依赖SQL
Yii::app()->cache->set($id, $value, 30, new CDbCacheDependency('SELECT ...'));

举个列子:
在一个数据比较庞大的订单记录中统计时间段内的成交金额,以及利润,在这样的查询页面会产生过多的加载时间,等待是痛苦的。我们可以将查询的结果按时间段存储到缓存中,订单是变化的,统计的时间段一旦涉及今天,则统计需依赖订单的最新创建时间,如创建时间变化,此时缓存失效,可重新生成缓存;反之,缓存不受影响;

/*订单表(order) id uerid price type(订单类型) state(1为已支付 0 未支付) paytime  createtime isdelete*/
#查询成交金额
function ordercheck($starttime,$endtime){  
$cacheid = "order".$starttime.$endtime;   //设置缓存id    
if( !Yii::app()->cache->get($cacheid) ){      
$sql = "SELECT SUM(price)  as sumprice FROM order WHERE  state=1 AND isdelete=0";       
$addsql = '';         
if( $starttime ) $addsql.=" AND createtime>={$starttime}";      
if( $endtime ) $addsql.=" AND createtime>={$endtime}";      
$res = Yii::app()->createCommand($sql.$addsql)->queryAll;        //开始时间或结束时间大于等于今天时间戳则建立依赖      
$date = date('Y-m-d',time());       
if( $starttime>=strtotime($date) || $endtime>=strtotime($date) ){            
//依赖条件为最新的订单时间发生改变  
$dependency = new CDbCacheDependency('SELECT MAX(createtime)  FROM order WHERE  state=1 AND isdelete=0');         
Yii::app()->cache->set($cacheid,$res['sumprice'] , 1800,$dependency);       
}else{   
Yii::app()->cache->set($cacheid, $res['sumprice'], 1800);      
}  
}   
return Yii::app()->cache->get($cacheid) ;   
}
  • 依赖表达式

#表达式
Yii::app()->cache->set($id, $value, 30, new CExpressionDependency(yii::app->session('automer')));

上面的例子当全局的session automer 发生变化,相应的缓存失效。
其他的缓存就不再此介绍了,我觉得重要的是理解缓存及缓存依赖的概念
,多写些应用场景,就能设计出实用的缓存程序,这对于界面的加载反应时间将提高很多速度。我做过的项目中,有数据都是通过接口获取的,当写一个复杂的逻辑就会调用很多次接口,非常费时,通过缓存数据就不需要再请求接口的时间。有点瑕疵的就是第一次加载是费时的,不过也是可以解决的,如果有个脚本在更新这个缓存,那就不是问题。还有更深入的,缓存依赖管理工具,它将为你管理生成所需的缓存,这里就起一个抛砖引玉的作用,不再深究。

Yii也提供很多好的缓存方法,片段缓存,页面缓存,HTTP缓存。。。
挺不错的,在理解的基础上灵活应用也是一大进步。

加油各位,加油自己,天行健!

YII缓存依赖的应用的更多相关文章

  1. 缓存技术之——Yii2性能优化之:缓存依赖

    Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化.有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的. 依赖可 ...

  2. YII缓存Cache

    缓存Cache 定义:将数据暂时存放在一个存储速度更快的介质上,下次读取数据时就可以从这个介质上来读取数据 介质:内存.文件.数据库(优化好的数据库) Yii缓存的分类:(framework/cach ...

  3. yii 缓存探究

    1.在配置文件中 //在权威指南上是'cache' 其实可以根据不同的缓存组件起不同的名称 //memcache缓存 'memcache' => array( 'class' => 'sy ...

  4. YII缓存整理

    缓存 缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 如下的应用配置指定了一 ...

  5. 如何使用yii2的缓存依赖特性

    目录 如何使用yii2的缓存依赖特性 概述 页面缓存 缓存依赖 链式依赖 总结 如何使用yii2的缓存依赖特性 概述 缓存是Yii2的强大特性之一,合理使用缓存技术可以有效地减小服务器的访问压力.Yi ...

  6. Yii2.0数据库缓存依赖发布的使用理解

    对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍 ...

  7. 缓存依赖中cachedependency对象

    缓存依赖主要提供以下功能:1.SQL 缓存依赖项可用于应用程序缓存和页输出缓存.2.可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项.3.可以在网络园(一台服务器上存在多个处理 ...

  8. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

  9. ASP.NET MVC3系列页面缓存、缓存依赖SQL(真实项目注意细节)

    缓存依赖数据库 第一步 1通过vs里面带的命令提示窗口. 2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4. ...

随机推荐

  1. setTimeout 和 setInteval 的区别。

    学习前端的可能都知道js有2个定时器setTimeOut和setinteval.用的时候可能不是很在意,但是2者还是有区别的 setTimeout方法是定时程序,也就是在什么时间以后干什么.干完就完了 ...

  2. 基于opencv的车牌识别系统

    前言 学习了很长一段时间了,需要沉淀下,而最好的办法就是做一个东西来应用学习的东西,同时也是一个学习的过程. 概述     OpenCV的全称是:Open Source Computer Vision ...

  3. 2.Ubuntu16.04安装QT5.8.0

    VSCode编辑器开发CPP:http://www.cnblogs.com/dotnetcrazy/p/6661921.html 下载QT run文件(安装包),一般都是这两个下载的比较多,我这边使用 ...

  4. 一个 Vue + Node + MongoDB 博客系统

    源码 耗时半载(半个月)的大项目终于完成了.这是一个博客系统,使用 Vue 做前端框架,Node + express 做后端,数据库使用的是 MongoDB.实现了用户注册.用户登录.博客管理(文章的 ...

  5. PHP 魔术方法__set() __get() 方法

    a); //output: 123 var_dump($s->b); //output: 123 var_dump($s->c); //output: null var_dump($s-& ...

  6. centos7安装redis3.0和phpredis扩展详细教程(图文)

    整理一下centos7安装redis3.0和phpredis扩展的过程,有需要的朋友可以拿去使用. 一.安装redis3.0 1.安装必要的包 yum install gcc 2.centos7安装r ...

  7. 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为 ...

  8. 开始奇妙的DP之旅

    铭记各位大佬教导,开始看一些很迷的动态规划,那就从比较典型的01背包开始吧,想想还是从比较简单的导弹拦截开始吧,说简单都是骗人的,还是看采药吧. 一.动态规划 刚听到动态规划这个东西,据HLT大佬所言 ...

  9. 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题

    继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...

  10. 界面底部Tab实现

    现在基本上大部分的手机APP都要实现底部Tab,底部实现Tab的实现方式有很多种,那么有没有好的实现方式呢? 今天我将使用一个开源插件来实现底部Tab 参考自zhangli_的博客:http://bl ...