缓存,什么是缓存呢?大家想必都非常清楚,缓存就是数据交换的缓冲区,
就程序而言,
Yii 缓存
11.1
Yii::$app 应用主体
Yii::$app->cache 缓存组件
Class yii\caching\FileCache较大块的数据
cachePath 默认runtime/cache
把文件删除,又要5s
运行后又生成
根据存储介质的不同,可分为
FileCache文件ApcCache PHP APC扩展DbCache表DummyCache仅作为一个缓存占位符MemCache使用PHP memcache和memcached扩展yii\redis\Cache基于Redis键值对存储WinCache使用PHP WinCache扩展XCache使用PHP XCache扩展ZendDataCache ZendDataCache扩展
存储介质不同
方法get,set
缓存API
get 返回falseset key,value
add(),只会在键名不存在的时候才会放到缓存中multiGet()multiSet()multiAdd()exists()delete()flush()删除所有的缓存数据
组件的可替代性,直接换配置文件的组件
因为使用了同样的API
缓存键
缓存键前缀
keyPrefix
11.2
优化了性能
增加一篇文章,文章条数应该加1,
缓存空间已经满的极端情况,
不合理的,有什么方法干预缓存呢?
缓存过期
优化效果和实时性的矛盾Yii::$app->cache->set('postCount', $data, 60);
缓存依赖与缓存过期可以一起使用
文章数据发生了变化,刷新缓存
对象,条件
set时,会记下sql的执行结果
DbDependency如果指定SQL语句的查询结果发生了变化,则依赖改变。FileDependency如果文件的最后修改时间发生变化,则依赖改变ChainedDependency如果依赖链上任何一个依赖发生变化,则依赖改变ExpressionDependency如果指定的PHP表达式执行结果发生变化,则依赖改变TagDependency将一项缓存数据标记到一个组名,你可以通过调用对象的 invalidate() 一次性将相同组名的缓存全部置为失效状态
$dependency = new \yii\caching\DbDependency(
[\'sql\'=>\'select count(id) from post\']
);
Yii::$app->cache->set(\'postCount\', $data, 600, $dependency);
选择合适的依赖条件,
解决实时性,准确反映缓存数据的变化,
计算依赖结果所消耗的资源远小于计算数据结果所消耗的资源
缓存过期,缓存依赖
11.3
片段缓存,页面缓存 标签云的片段
$dependency = new \yii\caching\DbDependency(
[\'sql\'=>\'select count(id) from post\']
);
if( $this->beginCache(\'cache\', [
\'duration\' => 600,
\'dependency\' => $dependency,
]) )
{
echo TagsCloudWidget::widget([\'tags\'=>$tags]);
$this->endCache();
}
缓存依赖
缓存嵌套
片段缓存可以被嵌套使用,一个片段缓存可以被另一个嵌套
动态内容,一大段静态内容中有少许动态内容的情况
调用\yii\base\View::renderDynamic(return 'Yii::$app->user->identity->name;');去插入动态内容
页面缓存
在 behaviors() 方法
\'pageCache\' => [
\'class\' => \'yii\filters\PageCache\',
\'only\' => [\'index\'],
\'duration\' => 600,
\'dependency\' => [
\'class\' => \'yii\caching\DbDependency\',
\'sql\' => \'select count(id) from post\',
],
];
点第二页的时候,还是第一页的内容
\'variations\' => [
Yii::$app->request->get(\'page\'),
];
查询的时候
\'variations\' => [
Yii::$app->request->get(\'page\'),
Yii::$app->request->get(\'PostSearch\'),
];
缓存整个页面
也支持缓存过期和缓存依赖
可以在使用页面缓存的同时,使用片段缓存和动态内容
缓存变化
缓存的内容需要根据一些参数的变化而变化
如,Web应用支持多语言['variations'=>[Yii::$app->language]];
11.4 HTTP 缓存
耗时生成的数据,页面内容缓存在服务器上 利用客户端缓存
behaviors()
\'httpCache\' => [
\'class\' => \'yii\filters\HttpCache\',
\'only\' => [\'detail\'],
\'lastModified\' => function($action, $params)
{
$q = new \yii\db\Query();
return $q->from(\'post\')->max(\'update_time\');
},
\'etagSeed\' => function($action, $params)
{
$post = $this->findModel(Yii::$app->request->get(\'id\'));
return serialize([$post->title, $post->conent]);
},
\'CacheControlHeader\' => \'public,max-age=600\',
];
Load 3.07s
HTTP 头
\yii\filters\HttpCache::lastModified\yii\filters\HttpCache::ctagSeed\yii\filters\HttpCache::cacheControlHeader
HTTP 协议
头和主体
响应头 Last-Modified 头
使用时间戳标明页面自上次客户端缓存后是否被修改过
通过配置lastModified属性向客户端发送Last-Modified头。
ETag头
Hash 值Cache-Control 头指定了页面的常规缓存策略。
可以通过配置 \yii\filters\HttpCache::cacheControlHeader 属性发送相应的头信息
缓存过期用得最多