Yii中的缓存依赖,简单来讲就是将缓存和另一个东西绑定在一块儿,若是另一个东西发生变化,那么缓存也将发生变化。有点儿相似于JS中的触发事件(可是也不那么像),缓存的变更是依赖的东西所致使的。php
依赖能够是文件、数据库、甚至是一些表达式。功能十分强大。sql
Yii提供了5中依赖方法,咱们这里介绍其中的3种经常使用依赖。数据库
顾名思义就是将缓存和文件绑定在一块儿。若是文件的内容发生变化,那么缓存将会收到影响。(Yii判断的标准是文件的最后修改时间)express
咱们经过实例来演示一下这个过程。缓存
一、首先获取缓存组件app
$cache = \Yii::$app->cache;
二、实例化FileDependency
类(其中文件依赖名字为:fileName
),同时将其赋值给$dependency
变量。这里,咱们将缓存和yanying.txt
文件作关联,若是yanying.txt
内容发生变化,那么和之对应的缓存将失效,不能访问。yii
$dependency = new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);
三、下面咱们在缓存中添加一个key
为file_key
,给其的值为hello world
。同时将过时时间设置为3000秒,最后一个参数写上$dependency
依赖。code
$cache->add('file_key','hello world',3000,$dependency);
四、在3000秒以内,咱们刷新网页。一直能够获取到file_key
的值为hello world
。事件
$cache->get('file_key'); // hello world
五、这时,咱们改变yanying.txt
文件内的值。尽管缓存并无过时,咱们也没法获取到缓存的值。由于依赖的文件发生了变化,缓存即被失效。get
var_dump($cache->get('file_key')); // false
表达式依赖是将表达式运算事后的值和缓存捆在一块儿造成依赖,当表达式值发生变化时候,缓存将受到影响
一、同上获取缓存组件
$cache = \Yii::$app->cache;
二、实例化ExpressionDependency
类(表达式依赖名字为:expression
),同时将其赋值给$dependency
变量。这里,表达式依赖不一样于文件依赖,他的expression
所对应的是\Yii::$app->request->get("id")
,是直接get连接中的id值(这里的表达式是php表达式,不仅限制于YII代码)。
$dependency = new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
三、下面咱们在缓存中添加一个key
为file_key
,值为hello world
。同时将其过时时间设置为3000秒以后,最后一个参数写上$dependency
依赖。
$cache->add('file_key','hello world',3000,$dependency);
四、在3000秒以内,咱们刷新网页,同上,一直能够获取到file_key
的值为hello world
。
$cache->get('file_key'); // hello world
五、这时,咱们改变连接中id
的值。那么:\Yii::$app->request->get("id")
获取到的值即会发生变化,则缓存失效。同时没法获取缓存的值。
var_dump($cache->get('file_key')); // false
db依赖也是实际生产中最常接触的一种依赖,咱们能够将SQL语句直接做为依赖条件。当数据库查询出的内容发生变化时候,缓存即会受到影响。
依此,咱们能够经过此方法来判断咱们缓存的数据是否须要更新,当数据库有变化内容时候,咱们更新缓存。
一、首先仍是获取缓存组件
$cache = \Yii::$app->cache;
二、实例化DbDependency
类(db依赖名为:sql)。同时将其赋值给$dependency
变量。其中sql
对应的值是直接可执行的sql语句。
$dependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM user']);
三、下面咱们在缓存中添加一个key
为file_key
,值为hello world
。同时将其过时时间设置为3000秒以后,最后一个参数写上$dependency
依赖。
$cache->add('file_key','hello world',3000,$dependency);
四、假设数据库数据一直没有发生变化,那么3000秒以内此缓存不会发生任何变化。咱们能够经过下面代码直接获取值hello world
.
$cache->get('file_key'); // hello world
五、这时,若是数据库添加了一条新的数据,那么此缓存即将失效,没法获取。这里sql依赖判断标准是查询结果,咱们这里使用了记录的条数,你也能够直接使用select * from table
只要结果发生变化,都会影响缓存
var_dump($cache->get('file_key')); // false
这时咱们也能够愉快的从新获取数据库值,进行新的缓存啦。