文档章节

北哥大话Yii2缓存机制 - 缓存依赖

阿北2017
 阿北2017
发布于 2017/04/02 14:35
字数 1086
阅读 380
收藏 13

我们都知道,yii2的缓存是支持依赖的,就是我们设置的缓存是否失效除了过期时间还决定于它所依赖的东东是否变化。

用好依赖将大大提高我们使用缓存的效果,本节讲解yii2缓存的5种依赖方式。

还是先列某

  1. yii\caching\DbDependency
  2. yii\caching\ExpressionDependency
  3. yii\caching\FileDependency
  4. yii\caching\TagDependency
  5. yii\caching\ChainedDependency

begin...

DbDependency

我们可以将SQL语句直接作为依赖条件。当数据库查询出的内容发生变化时候,缓存即会受到影响。

假设我当前要搜索出所有的分类信息并缓存起来,每3000秒更新一次或当分类有变化是后自动更新,使用DbDependency我们可以轻松实现。

$dependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM category']);
$cache->add('category',function($cache){
    return Category::find()->all();
},3600,dependency);

使用缓存获取数据

$cache->get("category");

代码执行后,当超过3000秒或分类字段条数有变化,都将缓存设置为失效。该依赖的推荐为依赖里执行的sql语句所损耗的资源最好小于缓存所带来的损耗。

ExpressionDependency

指定的 PHP 表达式执行结果发生变化,则缓存变化,这里的表达式为整个PHP,而不局限于Yii。

$dependency = new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
$cache->add("hy","Hello Yii",3000,$dependency);

获取缓存数据

$cache->get("hy");

如上面代码,我们在3000之内使用hy都直接从缓存读取Hello Yii,但是当使用缓存的页面url ?id=xx发生变化的时候则失败,返回flase

FileDependency

将缓存和文件绑定在一起。如果文件的内容发生变化,那么缓存将会收到影响。而Yii是根据这个文件的最后修改时间来判断其内容是否变化的。

依赖文件 hello.txt,其内容为a

设置依赖

$dependency = new \yii\caching\FileDependency(['fileName'=>'@app/hello.txt']);
$cache->add("hy","Hello Yii",3000,$dependency);

获取缓存数据

$cache->get("hy");

现在当我们将hello.txt 内容改为b的时候,再次获取缓存则失败,返回flase。 小提示:文件路径可以使用别名哦

TagDependency

该类依赖的意思是某个或某些缓存是否失效除了由时间决定,还有一个标签决定,举例说明

use yii\caching\TagDependency;
$cache->add("abc","Hello Yii",3000,new TagDependency(['tags' => 'num']));

此刻我们设置了一个缓存abc,它依赖于标签num

当我们在其他的代码中执行了

use yii\caching\TagDependency;
TagDependency::invalidate(Yii::$app->cache, 'num');

当我们执行TagDependency::invalidate(Yii::$app->cache, 'num');时,可以将与num标签相关的缓存设置为无效,因此当我们再次获取时,abc已经失效,即便3000秒还没有到。

ChainedDependency

一个系统中的数据是彼此相连的,缓存的依赖也可能出现多种联系,使用TagDependency可以将一组缓存标记为同一个标签,然后使用invalidate函数将这组缓存统一失效,但是这样还不足以满足千变万化的依赖关系。

因此 ChainedDependency 出现了,我们可以将一系列的缓存依赖使用 ChainedDependency 组合起来,这样当这个组合中的某个或全部依赖发生变化后,将直接影响到缓存。

现在我们仍然通过一个例子说明,假设我们的一个缓存同时依赖于两个依赖。

$cache = Yii::$app->cache;
$fileDependency = new \yii\caching\FileDependency(['fileName'=>'@app/hello.txt']);
$sqlDependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM category']);

$cache->set('abc', 'hello yii', 3000, new ChainedDependency([
	'dependOnAll'=>true,
	'dependencies' => [$fileDependency, $sqlDependency]
]));

这样,当 $fileDependency$sqlDependency 中任何一个依赖发生变化后都会引起缓存的失效,这里要注意一个问题 dependOnAll(默认为true),当为true时,只要依赖组合中的一个发生变化则缓存失效,否则必须每个依赖都变化才会引起缓存的失效。

北哥的话

缓存是我们提供程序性能的主要手段,以上五种依赖务必记住,当我们使用缓存的时候,优化缓存逻辑也是我们要考虑的,如何有效的使用依赖保证因为依赖而带来的各种延时,是每个攻城狮要研究的。

原文链接 http://nai8.me/sapper-index.html

© 著作权归作者所有

阿北2017
粉丝 67
博文 58
码字总数 74348
作品 0
洛阳
私信 提问
加载中

评论(2)

阿北2017
阿北2017

引用来自“__FresHmaN”的评论

北哥就是屌屌的。

回复@__FresHmaN : 主要是帅
__FresHmaN
__FresHmaN
北哥就是屌屌的。
Yii2 实例管理

Yii2 实例管理 Yii2框架没有提供类似ZendFramework3中提供的ServiceManager.那么Yii2框架是如何管理对象实例的呢? 长时间使用Yii2框架的童鞋一定已经适应了对象中的public变量,以及一个来自y...

Vett
2017/12/23
0
0
yii2开发中19条推荐实践(阿北总结)

虽然每个人的编程风格不同,但是有些建议能让你的代码更加规范和稳定,本次就我这次网站更新总结如下几点,希望对你的yii2学习和使用有所帮助。 环境说明 服务器环境: CentOS 开发环境及IDE...

阿北2017
2018/06/02
0
0
PHP 技术提升计划

Composer 第三方包管理工具 Coreseek/Sphinx 全文搜索 Http协议 socket协议 队列服务 事件与钩子 依赖注入 事件驱动 静态缓存 数据库缓存 内存缓存Redis/memcache LAMP/LNMP 环境熟悉 auth2....

cgjcgs
2016/03/30
9
1
小紫羽/yii2-swoole

yii2-swoole 为赋予 Yii2 框架协程异步能力而生。 此插件基于 swoole (v2.0) 底层实现的协程,改造 Yii2 的核心代码,使开发者无感知,以及在不改动业务代码的情况下,用上 swoole 的异步IO能...

小紫羽
2017/09/11
0
0
关于把一些配置信息写入数据库的想法

目前海昱中很多的配置信息是写在config/params.php文件中的 我想参考opencart的系统设置,把这些内容写入数据库 新建表 同时,yii开启CFileCache缓存机制,把配置信息写入缓存,减少对数据库...

zjl_longer
2016/06/17
3
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部