YII缓存依赖的应用

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缓存。。。

挺不错的,在理解的基础上灵活应用也是一大进步。

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

时间: 2024-11-10 01:01:40

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

YII缓存Cache

缓存Cache 定义:将数据暂时存放在一个存储速度更快的介质上,下次读取数据时就可以从这个介质上来读取数据 介质:内存.文件.数据库(优化好的数据库) Yii缓存的分类:(framework/caching/)在main.php中设置缓存时要用 CDbCache.php数据库缓存 CFileCache.php文件缓存 CMemCache.php内存缓存 文件缓存分类: 片段缓存 页面缓存 动态缓存 数据缓存 在main.php全局配置文件中设置缓存 'components'=>array( &quo

YII缓存整理

缓存 缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 如下的应用配置指定了一个使用两台缓存服务器的 memcache 缓存组件: [plain] view plaincopyprint? array( ...... 'components'=>array( ...... 'cache'=>array( 'class'=>'system.caching.CMemCac

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

对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍如下: 1.在需要缓存依赖发布的数据表新增一个update_time字段,每次添加.修改记录后都会相应改变update_time的值: 2.保证需要缓存依赖发布的数据表每次保存(包括更新操作)都能更新update_time的值: // 所有表model继承的基础BaseModel.php /** *

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

目录 如何使用yii2的缓存依赖特性 概述 页面缓存 缓存依赖 链式依赖 总结 如何使用yii2的缓存依赖特性 概述 缓存是Yii2的强大特性之一,合理使用缓存技术可以有效地减小服务器的访问压力.Yii2最基本的缓存包括数据缓存.片段缓存.页面缓存和HTTP缓存,这部分内容在官方文档中有更加详细的说明,这里不再赘述,如有需要可以参考Yii2官方开发文档中的缓存部分. 页面缓存 数据缓存与片段缓存都是针对网站中某一部分内容进行的缓存,这种缓存需要在代码部分进行显示声明,修改起来比较麻烦.相对的页面

开启SQLSERVER数据库缓存依赖优化网站性能

很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现SQL SERVER数据库的缓存,当数据表没有更新时,就从缓存中读取,当有更新的时候,才从数据表中读取呢,答案是肯定的,这样的话我们对一些常用的基础数据表就可以缓存起来,比如做新闻系统的新闻类别等,每次就不需要从数据库中读取了,加快网站的访问速度. 那么如何开启SQLSERVER数据库缓存依赖,方法如下: 第一步:修改Web.Config的<system.web>节的配置,代码如下,让

我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

[名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化. 以前也总结过缓存的使用 页面输出缓存:我用ASP.NET缓存之OutputCache 数据缓存:我用ASP.NET缓存之数据缓存 但是对缓存依赖还是很模糊,前阵子有幸在项目中实际运用了此类.现在结合自己的实际以及和网上大牛的经验,给大家分享一下. [使用背景

MVC缓存依赖:文件依赖

<1>所谓缓存依赖,文件依赖就是指,我不我没有设置缓存的过期时间,当缓存依赖的文件内容发生改变的时候,就通知framework清空缓存.然后重数据库中取数据(或者文件中取数据)然后又把取到是数据缓存起来,用户请求的时候,直接从缓存中取数据,如果缓存依赖的文件内容又发生改变,就又清空,周而复始.. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We

System.Web.Caching.Cache类 缓存 各种缓存依赖

System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用

Sql缓存依赖

Sql缓存依赖主要分为两种: 1.轮询模式(poll model) 2.推模式(push model) 今天先讲解第一种模式:轮询 要使用sql轮询模式,得做三方面的工作: 1.对数据库启用缓存依赖 2.对一个或多个表启用缓存依赖 3.在web.config中配置应用程序 一.对数据启用缓存依赖 在visual studio command prompt中执行以下命令 aspnet_regsql -C "Data Souce=localhost;Integrated Security=True;