PHP

Yii2缓存机制 - 缓存依赖

 Yii2缓存一共有5种依赖方式:

  1. yiicachingDbDependency

  2. yiicachingExpressionDependency

  3. yiicachingFileDependency

  4. yiicachingTagDependency

  5. yiicachingChainedDependency

DbDependency

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

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

  1.  
    $dependency = new yiicachingDbDependency(['sql'=>'SELECT COUNT(*) FROM category']);
  2.  
    $cache->add('category',function($cache){
  3.  
    return Category::find()->all();
  4.  
    },3600,dependency);

使用缓存获取数据

$cache->get("category");

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

ExpressionDependency

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

  1.  
    $dependency = new yiicachingExpressionDependency(['expression'=>'Yii::$app->request->get("id")']);
  2.  
    $cache->add("hy","Hello Yii",3000,$dependency);

获取缓存数据

$cache->get("hy");

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

FileDependency

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

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

设置依赖

  1.  
    $dependency = new yiicachingFileDependency(['fileName'=>'@app/hello.txt']);
  2.  
    $cache->add("hy","Hello Yii",3000,$dependency);

获取缓存数据

$cache->get("hy");

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

TagDependency

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

  1.  
    use yiicachingTagDependency;
  2.  
    $cache->add("abc","Hello Yii",3000,new TagDependency(['tags' => 'num']));

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

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

  1.  
    use yiicachingTagDependency;
  2.  
    TagDependency::invalidate(Yii::$app->cache, 'num');

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

ChainedDependency

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

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

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

  1.  
    $cache = Yii::$app->cache;
  2.  
    $fileDependency = new yiicachingFileDependency(['fileName'=>'@app/hello.txt']);
  3.  
    $sqlDependency = new yiicachingDbDependency(['sql'=>'SELECT COUNT(*) FROM category']);
  4.  
     
  5.  
    $cache->set('abc', 'hello yii', 3000, new ChainedDependency([
  6.  
    'dependOnAll'=>true,
  7.  
    'dependencies' => [$fileDependency, $sqlDependency]
  8.  
    ]));

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

Publish Comment发表评论

点击刷新验证码 点击图片可刷新验证码

Comment网友评论

詹绍乾 Jancy © 版权所有 2020

Copyright © 2010 by zhansq.cn All right reserved.