【问题标题】:memcache on yii blog architectureyii 博客架构上的 memcache
【发布时间】:2012-09-15 05:05:53
【问题描述】:

我最近在我的 php yii 网站上添加了一个博客,它是 yii 博客演示的一个经过大量修改的版本。我的博客使用活动记录,不幸的是,它使用大约 20 次数据库调用来显示帖子。我想用 memcache 加快速度。我想在内存中缓存尽可能多的内容,以摆脱大量的数据库调用。我已经启用了模式缓存,这将调用次数减少到 12 或 13 次,但这仍然太多了。

在对我的博客进行负载测试时,我发现在重负载下我的 CPU 是限制因素。我还有很多内存。所以我希望使用一些额外的内存可以减少我的 cpu 的负载。这就是 memcache 的用武之地。问题在于如何构建它。

我已经想出了如何使用 cmets 和标签缓存单个帖子,这并不难。我正在努力解决的是如何缓存索引页面,每个页面都有许多帖子。第 1 页将有 5 个帖子,第 2 页将有 5 个帖子,等等。我正在像这样进行数据库调用:

           $criteria=new CDbCriteria(array(
                    'condition'=>'status='.Post::STATUS_PUBLISHED,
                    'order'=>'create_time DESC',
                    'with'=>'commentCount',
            ));
            if(!is_null($tag))
                    $criteria->addSearchCondition('tags', $tag);

            $dataProvider=new ActiveDataProvider('Post', array(
                    'pagination'=>array(
                            'pageVar'=>'page',
                            'pageSize'=>5,
                    ),
                    'criteria'=>$criteria,
            ));

            $this->render('index',array(
                    'dataProvider'=>$dataProvider,
            ));

我原本以为我可以只缓存生成的 $dataProvider ,并将查询字符串作为键。我可以得到的东西:

echo http_build_query($criteria->toArray());

我必须将页码附加到该键,但这很容易。但是,这样做意味着我需要为每个页面和每个标签缓存一个单独的 dataProvider,如果我要更新标签或添加新帖子,这将是一场噩梦。

我相信你们中的一位杰出人士可以给我一些建议。我不知道如何构建它。

【问题讨论】:

  • 为什么不缓存整个页面?
  • 这就是我要说的。如果我要捕获每个页面,如果我要创建一个新帖子,那么我将不得不使缓存中的所有索引页面以及与标记相同的帖子相关联的任何页面无效。
  • 我不认为使缓存失效有什么大不了的。如果您现在有 20 个数据库调用和大量 PHP 代码执行每个页面加载,那么您现在每次有新帖子或新标签时都会拥有它。你得到了很多。

标签: php architecture yii memcached blogs


【解决方案1】:

在我看来,缓存整个页面或页面的片段是要走的路。

为了缓存整个页面(或动作),yii 提供了COutputCache。对于片段缓存,有CController::beginCache()CController::endCache()。有关更多信息,请参阅 page cachingfragment caching 的文档

关于在内容更改时使缓存失效

来自 yii 文档

除了过期设置,缓存数据也可能失效 根据一些依赖变化。例如,如果我们正在缓存 某些文件的内容和文件被更改,我们应该无效 缓存的副本并从文件中读取最新内容,而不是 缓存。

依赖可以通过CCacheDependency或其子类的实例来指定。对于您的特定需要,您可以将CDbCacheDependency 与 sql 类似

SELECT `update_time` from post where `id`=:id 

用于缓存特定帖子条目的页面。

有关其他可用的依赖类,请参阅documentation

【讨论】:

  • 但是使用 CDbCacheDependency 意味着在每次缓存命中之前,都会运行一个查询以确保缓存条目有效。因此,如果我使用该特定依赖项,我所做的就是将一个昂贵的 sql 查询换成一个更便宜的查询,对吗?因为我现在可以看到依赖项查询。我还有很多疑问,只是它们都很便宜。也许我最好不要使用依赖项,只是自己使缓存条目无效。我打赌最终会保存一些查询。我将运行一些基准测试并查看。
  • 使用 CDbCacheDependency 不是强制性的。您可以使用其他依赖项。例如,将帖子的更新时间戳存储在文件中,您可以使用 CFileCacheDependency。
  • 感谢您的帮助。在进行了一些基准测试之后,使用带有依赖项的查询缓存并没有真正让我的博客变得更快。并不是我的查询真的很昂贵,只是有很多查询。使用依赖项将一个查询交换为另一个查询,即使是其他类型的依赖项也是如此。我将研究使用 yii 的 get 和 set 实现以及手动使缓存条目无效。希望这会加快速度。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多