Yii2缓存一共有5种依赖方式:
-
yii\caching\DbDependency
-
yii\caching\ExpressionDependency
-
yii\caching\FileDependency
-
yii\caching\TagDependency
-
yii\caching\ChainedDependency
DbDependency
我们可以将SQL语句直接作为依赖条件。当数据库查询出的内容发生变化时候,缓存即会受到影响。
假设我当前要搜索出所有的分类信息并缓存起来,每3000秒更新一次或当分类有变化是后自动更新,使用DbDependency我们可以轻松实现。
使用缓存获取数据
$cache->get("category");
代码执行后,当超过3000秒或分类字段条数有变化,都将缓存设置为失效。该依赖的推荐为依赖里执行的sql语句所损耗的资源最好小于缓存所带来的损耗。
ExpressionDependency
指定的 PHP 表达式执行结果发生变化,则缓存变化,这里的表达式为整个PHP,而不局限于Yii。
获取缓存数据
$cache->get("hy");
如上面代码,我们在3000之内使用hy都直接从缓存读取Hello Yii,但是当使用缓存的页面url ?id=xx发生变化的时候则失败,返回flase
FileDependency
将缓存和文件绑定在一起。如果文件的内容发生变化,那么缓存将会收到影响。而Yii是根据这个文件的最后修改时间来判断其内容是否变化的。
依赖文件 hello.txt,其内容为a
设置依赖
获取缓存数据
$cache->get("hy");
现在当我们将hello.txt 内容改为b的时候,再次获取缓存则失败,返回flase。
小提示:文件路径可以使用别名哦
TagDependency
该类依赖的意思是某个或某些缓存是否失效除了由时间决定,还有一个标签决定,举例说明
此刻我们设置了一个缓存abc,它依赖于标签num
当我们在其他的代码中执行了
当我们执行TagDependency::invalidate(Yii::$app->cache, 'num');时,可以将与num标签相关的缓存设置为无效,因此当我们再次获取时,abc已经失效,即便3000秒还没有到。
ChainedDependency
一个系统中的数据是彼此相连的,缓存的依赖也可能出现多种联系,使用TagDependency可以将一组缓存标记为同一个标签,然后使用invalidate函数将这组缓存统一失效,但是这样还不足以满足千变万化的依赖关系。
因此 ChainedDependency 出现了,我们可以将一系列的缓存依赖使用 ChainedDependency 组合起来,这样当这个组合中的某个或全部依赖发生变化后,将直接影响到缓存。
现在我们仍然通过一个例子说明,假设我们的一个缓存同时依赖于两个依赖。
这样,当 $fileDependency 和 $sqlDependency 中任何一个依赖发生变化后都会引起缓存的失效,这里要注意一个问题 dependOnAll(默认为true),当为true时,只要依赖组合中的一个发生变化则缓存失效,否则必须每个依赖都变化才会引起缓存的失效。