缓存技术之——Yii2性能优化之:缓存依赖

简介: Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化。有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的。依赖可以是文件、数据库、甚至是一些表达式。

Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化。有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的。

依赖可以是文件、数据库、甚至是一些表达式。功能十分强大。

Yii提供了5中依赖方法,我们这里介绍其中的3种常用依赖。

1、文件依赖

顾名思义就是将缓存和文件绑定在一起。如果文件的内容发生变化,那么缓存将会收到影响。(Yii判断的标准是文件的最后修改时间)

我们通过实例来演示一下这个过程。

1、首先获取缓存组件

$cache = \Yii::$app->cache;

2、实例化FileDependency类(其中文件依赖名字为:fileName),同时将其赋值给$dependency变量。这里,我们将缓存和yanying.txt文件做关联,如果yanying.txt内容发生变化,那么和之对应的缓存将失效,不能访问。

$dependency = new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);

3、下面我们在缓存中添加一个keyfile_key,给其的值为hello world。同时将过期时间设置为3000秒,最后一个参数写上$dependency依赖。

$cache->add('file_key','hello world',3000,$dependency);

4、在3000秒之内,我们刷新网页。一直可以获取到file_key的值为hello world

$cache->get('file_key'); // hello world

5、这时,我们改变yanying.txt文件内的值。尽管缓存并没有过期,我们也无法获取到缓存的值。因为依赖的文件发生了变化,缓存即被失效。

var_dump($cache->get('file_key')); // false

2、表达式依赖

表达式依赖是将表达式运算过后的值和缓存捆在一起形成依赖,当表达式值发生变化时候,缓存将受到影响

1、同上获取缓存组件

$cache = \Yii::$app->cache;

2、实例化ExpressionDependency类(表达式依赖名字为:expression),同时将其赋值给$dependency变量。这里,表达式依赖不同于文件依赖,他的expression所对应的是\Yii::$app->request->get("id"),是直接get链接中的id值(这里的表达式是php表达式,不只限制于YII代码)。

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

3、下面我们在缓存中添加一个keyfile_key,值为hello world。同时将其过期时间设置为3000秒之后,最后一个参数写上$dependency依赖。

$cache->add('file_key','hello world',3000,$dependency);

4、在3000秒之内,我们刷新网页,同上,一直可以获取到file_key的值为hello world

$cache->get('file_key'); // hello world

5、这时,我们改变链接中id的值。那么:\Yii::$app->request->get("id")获取到的值即会发生变化,则缓存失效。同时无法获取缓存的值。

var_dump($cache->get('file_key')); // false

3、db依赖

db依赖也是实际生产中最常接触的一种依赖,我们可以将SQL语句直接作为依赖条件。当数据库查询出的内容发生变化时候,缓存即会受到影响。

依此,我们可以通过此方法来判断我们缓存的数据是否需要更新,当数据库有变化内容时候,我们更新缓存。

1、首先还是获取缓存组件

$cache = \Yii::$app->cache;

2、实例化DbDependency类(db依赖名为:sql)。同时将其赋值给$dependency变量。其中sql对应的值是直接可执行的sql语句。

$dependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM user']);

3、下面我们在缓存中添加一个keyfile_key,值为hello world。同时将其过期时间设置为3000秒之后,最后一个参数写上$dependency依赖。

$cache->add('file_key','hello world',3000,$dependency);

4、假设数据库数据一直没有发生变化,那么3000秒之内此缓存不会发生任何变化。我们可以通过下面代码直接获取值hello world.

$cache->get('file_key'); // hello world

5、这时,如果数据库添加了一条新的数据,那么此缓存即将失效,无法获取。这里sql依赖判断标准是查询结果,我们这里使用了记录的条数,你也可以直接使用select * from table只要结果发生变化,都会影响缓存

var_dump($cache->get('file_key')); // false

这时我们也可以愉快的重新获取数据库值,进行新的缓存啦。

目录
相关文章
|
4天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
31 2
|
4天前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存与性能优化
【5月更文挑战第14天】 在动态语言的世界里,PHP一直因其高性能的执行效率和广泛的社区支持而备受青睐。随着Web应用的复杂性增加,对性能的要求也越来越高。本文将探讨PHP的Opcode缓存机制,解析其对性能提升的贡献,并展示如何通过配置和使用不同的Opcode缓存方案来进一步优化PHP应用的性能。我们将深入到PHP的核心,了解Opcode是如何生成的,以及它如何影响最终的执行效率。
|
4天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
4天前
|
存储 缓存 NoSQL
优质推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
优质推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
52 0
|
4天前
|
存储 数据采集 缓存
软件体系结构 - 缓存技术(10)布隆过滤器
【4月更文挑战第20天】软件体系结构 - 缓存技术(10)布隆过滤器
22 0
|
4天前
|
缓存 数据库 UED
软件体系结构 - 缓存技术(9)缓存穿透
【4月更文挑战第20天】软件体系结构 - 缓存技术(9)缓存穿透
76 13
|
4天前
|
缓存 监控 前端开发
软件体系结构 - 缓存技术(8)缓存雪崩
【4月更文挑战第20天】软件体系结构 - 缓存技术(8)缓存雪崩
81 17
|
4天前
|
缓存 NoSQL Redis
软件体系结构 - 缓存技术(7)Redis持久化方法
【4月更文挑战第20天】软件体系结构 - 缓存技术(7)Redis持久化方法
93 14
|
4天前
|
缓存 监控 算法
软件体系结构 - 缓存技术(6)淘汰策略
【4月更文挑战第20天】软件体系结构 - 缓存技术(6)淘汰策略
89 12
|
4天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
144 10