缓存,什么是缓存呢?大家想必都非常清楚,缓存就是数据交换的缓冲区,
就程序而言,
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
属性发送相应的头信息
缓存过期用得最多