如何使用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. Python实例---基于页面的后台管理[简单版]

    后台管理菜单 + 母板[css/content/js] 向后台提交数据[2种]:       1.  模态对话框(数据少操作,且Js复杂):        form表单 :优点:简单,前端提交后后台处 ...

  2. Linux中脚本的使用方法

    Linux中脚本的使用方法 一.前言 关于Linux中的脚本的用法,一直没有时间去好好地总结,正好今天下雨,就好好的整理一下思路吧,其实精通了一门语言,比如C语言,学习其他语言需要的成本是非常少的,同 ...

  3. .NET Reflector注册问题

    reflector工具不错, 终于8.x了,也可以注册了,但是不小心注册成standard版本了,但vs中无法使用,于是各种删注册表,后来找到何英涛的解决方案 下面介绍一个Reflector很坑的一个 ...

  4. php中的雷同方法

    php中又很多的可选语法,比如echo 使用echo()和print()都可以输出文本,他们的不同之处在于print()函数有一个返回值1代表输出成功,0代表输出失败,二echo()就没有返回值了. ...

  5. except but

    He didn't speak anything but Greek... 他只会说希腊语.The crew of the ship gave them nothing but bread to ea ...

  6. Mac appium iOS 安装命令

    1. brew install node 2. npm install -g appium #或者用安装包安装 3. brew install libimobiledevice --HEAD # in ...

  7. kernel3.13 针对 Vmware安装存在的问题解决

    vthread-3| W110: Failed to build vmnet. Failed to execute the build command VMware module patches an ...

  8. Eclipse中的BuildPath详解【转载】

    什么是Build Path? Build Path是指定Java工程所包含的资源属性集合. 在一个成熟的Java工程中,不仅仅有自己编写的源代码,还需要引用系统运行库(JRE).第三方的功能扩展库.工 ...

  9. 前端工程师使用 Deepin 笔记

    笔者是一枚前端开发,在学习 Linux 的时候碰到了一个问题 —— 怎么练手?因为自己电脑上面装的是 Windows 系统,所以学习 Linux 的时候没办法进行练习,而敲指令是学习 Linux 最高 ...

  10. window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)

    linux下基本没什么问题,但在window操作系统下比较麻烦. 需要添加环境变量path路径:C:\Program Files (x86)\PostgreSQL\9.3\bin 添加postgres ...