0%

Yii缓存

缓存,什么是缓存呢?大家想必都非常清楚,缓存就是数据交换的缓冲区,
就程序而言,

Yii 缓存

11.1

Yii::$app 应用主体 Yii::$app->cache 缓存组件 Class yii\caching\FileCache较大块的数据 cachePath 默认runtime/cache 把文件删除,又要5s 运行后又生成 根据存储介质的不同,可分为
  1. FileCache 文件
  2. ApcCache PHP APC 扩展
  3. DbCache
  4. DummyCache 仅作为一个缓存占位符
  5. MemCache 使用PHP memcachememcached 扩展
  6. yii\redis\Cache 基于Redis键值对存储
  7. WinCache 使用PHP WinCache 扩展
  8. XCache 使用PHP XCache 扩展
  9. ZendDataCache ZendDataCache扩展

存储介质不同

方法
get,set
缓存API
get 返回false
set 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() 一次性将相同组名的缓存全部置为失效状态
难道是更新成 yii\caching\TagDependency 了?
$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 属性发送相应的头信息

缓存过期用得最多