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

概述

缓存是Yii2的强大特性之一,合理使用缓存技术可以有效地减小服务器的访问压力。Yii2最基本的缓存包括数据缓存片段缓存页面缓存HTTP缓存,这部分内容在官方文档中有更加详细的说明,这里不再赘述,如有需要可以参考Yii2官方开发文档中的缓存部分

页面缓存

数据缓存与片段缓存都是针对网站中某一部分内容进行的缓存,这种缓存需要在代码部分进行显示声明,修改起来比较麻烦。相对的页面缓存则是针对控制器下方法,对这个方法的视图文件进行页面级别的缓存。由于页面缓存可以使用行为的形式,对控制器进行注入,修改的时候只要在控制器中修改对应的配置项即可,所以使用页面缓存更加简单,扩展性更强。

缓存依赖

一般来说,缓存可以增强服务器的性能,但会一定程度上减弱其交互性。所以需要对缓存进行定期的检查,清理过期数据,填充最新数据,以保证内容的及时准确。在这一点上,Yii2的缓存依赖可以有效解决这个问题。Yii2共有五个内置的缓存类,如下所示:

  • yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。
  • yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
  • yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
  • yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
  • yii\caching\TagDependency:将缓存的数据项与一个或多个标签相关联。 您可以通过调用 yii\caching\TagDependency::invalidate() 来检查指定标签的缓存数据项是否有效。

以数据库依赖DbDependency为例,在控制器IndexController中,声明依赖关系:

<?php

namespace frontend\controllers;

use yii\web\Controller;

class IndexController extends Controller
{
public function behaviors()
{
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
} public function actionIndex()
{
return $this->render('index');
} }

如代码所示,在行为方法behaviors()中声明页面配置的驱动类,only对应为一个数组,数组元素是需要缓存的方法对应的视图。duration表示过期时间,单位为秒。variations对应一个数组,系统会监听这个数组中内容是否发生了变化,如果发生变化就会刷新缓存,反之则不会。dependency对应依赖关系,其中class表示缓存依赖的类,sql表示一个一条查询语句。含义就是post数据表中记录的总条数发生变化时,就可以认为新增或者删除类某条数据,需要刷新缓存。

链式依赖

上面的例子非常简单,而实际开发往往要更加复杂。有时候一个页面是否需要刷新由很多因素决定,不是一个关系就可以描述清楚的。比如说post数据表中既没有删除没有增加,而是更新一条数据,那上面那查询语句就无法处理类。这时候,可以用SELECT MAX(*) FROM post检测更新,但内置页面缓存类中无法直接写入这两个查询,这时候可以用链式依赖的内置类来解决这个问题。

所谓链式依赖,就是将缓存依赖关系配置到一个链中,一旦链中某个关系不成立,就会刷新缓存。

其中yii\caching\ChainedDependency就是缓存依赖的主要实现类。实现代码如下所示:

<?php

namespace frontend\controllers;

use yii\web\Controller;

class IndexController extends Controller
{
public function behaviors()
{
return [
'pageCache' => [
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 24 * 3600 * 365, // 1 year
'variations' => [
\Yii::$app->language,
\Yii::$app->id
],
'dependency' => [
'class' => 'yii\caching\ChainedDependency',
'dependencies' => [
new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']),
new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']),
new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']),
new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']),
new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);
]
],
],
];
} public function actionIndex()
{
return $this->render('index');
} }

如上所示,dependency中配置类Yii2内置的链式依赖,并在dependencies中定义类缓存依赖关系的“链”。当链上某个关系不成立时,就会刷新缓存。另外在整个缓存页面中,如果某一小部分并不需要缓存,可以将其设置为动态内容,这部分可以查看官方文档,不过更推荐看源码,文档介绍的比较简单。

总结

Yii2没有提供HTML页面静态化的内置功能,而是提供了缓存机制。在开发网站的时候可以通过伪静态+缓存的方式优化内容页面,并且采用内置的缓存依赖和链式依赖解决内容过期的问题,通过动态内容的设置处理不需要缓存的部分,比如登录后,首页可以会显示用户名,这部分就可以用动态内容。

如何使用yii2的缓存依赖特性的更多相关文章

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

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

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

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

  3. SQL server数据缓存依赖

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

  4. cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )

    Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...

  5. ASP.NET缓存全解析6:数据库缓存依赖 转自网络原文作者李天平

    更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据 ...

  6. (转)ASP.NET缓存全解析6:数据库缓存依赖

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  7. Asp.net数据库缓存依赖

    Asp.net数据库缓存依赖 更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这 ...

  8. SQL数据缓存依赖总结

    以前只听过SQL server数据缓存依赖,但一直没使用,由于项目需要,才研究了一番,发现了一个很诡异的问题,竟然是一个操作顺序问题导致的. SQL server数据缓存依赖有两种实现模式,轮询模式, ...

  9. SQL Server SqlCacheDependency 缓存依赖

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

随机推荐

  1. centos ntfs-3g 安装和使用

    安装fuse 下载fuse(ntfs-3g依赖fuse):http://vdisk.weibo.com/s/ajww5fZsUq50L?from=page_100505_profile&wvr ...

  2. 2.java相对路径与绝对路径

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz/test.txt 代表了test.txt文件的绝对路径.http://www. ...

  3. [EffectiveC++]item07:declare destructors virtual in polymorphic base class

  4. [T-ARA][거짓말(Part.1)][谎言(Part.1)]

    歌词来源:http://music.163.com/#/song?id=5403062 作曲 : 赵英秀 [作曲 : 赵英秀] 作词 : 安英民 [作词 : 安英民] 사랑한단 거짓말 보고싶을거란 ...

  5. python接口测试:自动保存cookies

    接口测试中遇到上一个请求返回响应包含cookie(如下图登录请求的响应结果).需将cookies保存下来,后续请求自动带入,否则会提示未登录. python requests的cookie类型是< ...

  6. python面向对象之类成员

    面向对象编程: OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得简单,并可以大大提高程序开发效率.另外,基于面向对象的程序可 ...

  7. SGU---462 Electrician 最大生成树

    题目链接: https://cn.vjudge.net/problem/SGU-462 题目大意: 有N条电线需要接入电网,第i条电线计划连接ai和bi两个地点,电线有两个属性:ri(电线稳定度)和c ...

  8. Django中模型(三)

    Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自 ...

  9. php is_callable()与method_exists()函数

    总结就是 method_exists()检查方法是否存在 is_callable()是否存在并可在当前作用域是否可调用

  10. PHP+JQUERY+AJAX上传、裁剪图片

    PHP部分 /*图片上传*/ public function upload1(){ $file = $_FILES['file']; $upload = new \Think\Upload();// ...