资讯专栏INFORMATION COLUMN

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

klivitamJ / 1683人阅读

摘要:我们都知道,的缓存是支持依赖的,就是我们设置的缓存是否失效除了过期时间还决定于它所依赖的东东是否变化。用好依赖将大大提高我们使用缓存的效果,本节讲解缓存的种依赖方式。现在我们仍然通过一个例子说明,假设我们的一个缓存同时依赖于两个依赖。

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

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

还是先列某

yiicachingDbDependency

yiicachingExpressionDependency

yiicachingFileDependency

yiicachingTagDependency

yiicachingChainedDependency

begin...

DbDependency

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

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

$dependency = new yiicachingDbDependency(["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 yiicachingExpressionDependency(["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 yiicachingFileDependency(["fileName"=>"@app/hello.txt"]);
$cache->add("hy","Hello Yii",3000,$dependency);

获取缓存数据

$cache->get("hy");

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

TagDependency

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

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

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

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

use yiicachingTagDependency;
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 yiicachingFileDependency(["fileName"=>"@app/hello.txt"]);
$sqlDependency = new yiicachingDbDependency(["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

下面是我的小广告,关注公众号,分享干货

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61857.html

相关文章

  • 北哥大话Yii2缓存机制 - File缓存

    摘要:讲的好长作为北哥大话缓存机制第一篇,希望大家喜欢,为了一段日子里我会专注于分享的缓存机制。 有的兄弟一定会说,File缓存有什么好讲的那?不就是一个set,然后在一个get么?那你知道的只是皮毛~ 的确如大家所说,缓存从表现层看就是一个set(放数据),然后再一个get(拿数据),但是请记住,这样是不够的,如果你不了解每个缓存的实现原理、存储特点等等,你是无法使用对场景的,什么时候用F...

    cnTomato 评论0 收藏0
  • 北哥大话Yii2缓存机制 - DbCache

    摘要:数据库缓存并不麻烦,基本用法依然符合缓存的统一接口,具体方法可以在里查看。会被的函数引用,该函数被和触发。 数据库缓存并不麻烦,基本用法依然符合yii2缓存的统一接口,具体方法可以在 http://nai8.me/sapper-view.ht... 里查看。 如果要启动数据库缓存,必须要有一个数据库及数据表,这些可以通过cache的配置文件完成 cache => [ class...

    PAMPANG 评论0 收藏0
  • 大话微服务架构故障隔离及容错处理机制

    摘要:优雅的服务降级微服务架构最大的优点之一就是当组件出现故障时,能隔离这些故障并且能做到优雅地服务降级。 本文首先介绍微服务架构存在的风险,然后针对如何避免微服务架构的故障,提出了多种有效的微服务架构中的方法和技术,其中例如服务降级、变更管理、健康检查和修复、断路器、限流器等。 目录 1、微服务架构的风险 2、优雅的服务降级 3、变更管理 4、健康检查和负载均衡 5、自我修复 6、故障转移...

    Binguner 评论0 收藏0
  • 大话微服务架构故障隔离及容错处理机制

    摘要:优雅的服务降级微服务架构最大的优点之一就是当组件出现故障时,能隔离这些故障并且能做到优雅地服务降级。 本文首先介绍微服务架构存在的风险,然后针对如何避免微服务架构的故障,提出了多种有效的微服务架构中的方法和技术,其中例如服务降级、变更管理、健康检查和修复、断路器、限流器等。 目录 1、微服务架构的风险 2、优雅的服务降级 3、变更管理 4、健康检查和负载均衡 5、自我修复 6、故障转移...

    Youngdze 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<