缓存技术之——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

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

目录
相关文章
|
2月前
|
缓存 资源调度 持续交付
在清空NPM缓存后,检查是否所有依赖都已正确安装
在清空NPM缓存后,检查是否所有依赖都已正确安装
|
10天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
30 2
|
13天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
15 1
|
1月前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
2月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
404 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
2月前
|
缓存 资源调度 持续交付
在清空NPM缓存后,如何检查是否所有依赖都已正确安装
在清空NPM缓存后,如何检查是否所有依赖都已正确安装
|
2月前
|
存储 缓存 NoSQL
【性能飙升的秘密】FastAPI应用如何借助缓存技术实现极速响应?揭秘高效Web开发的制胜法宝!
【8月更文挑战第31天】FastAPI是一个高性能Web框架,利用Starlette和Pydantic实现高效API构建。本文介绍如何通过缓存提升FastAPI应用性能,包括使用`starlette-cache[redis]`实现Redis缓存,以及缓存一致性和缓存策略的注意事项。通过具体示例展示了缓存的配置与应用,帮助开发者构建更高效的Web应用。
83 0
|
3月前
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
|
3月前
|
存储 缓存 算法
深入了解Memcached:缓存技术的利器
Memcached是一个开源的高性能分布式内存缓存系统,用于加速动态Web应用。它通过将数据库查询结果、API调用结果或其他数据缓存到内存中,减少对数据库的访问频率,从而提高应用的响应速度。本文详细介绍了Memcached的基本原理、架构、安装配置、使用方法、测试方法以及应用场景。通过Memcached,开发者可以有效提升Web应用的性能,减少数据库负载,改善用户体验。
52 5
|
3月前
|
存储 缓存 NoSQL
Java中的内存数据库与缓存技术
Java中的内存数据库与缓存技术