易博客架构上的memcache


memcache on yii blog architecture

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

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

我已经学会了如何缓存一篇带有评论和标签的帖子,这并不难。我正在努力解决的是如何缓存索引页,每个索引页上都有许多帖子。第1页将有5篇文章,第2页将有五篇文章,等等。我正在进行这样的数据库调用:

           $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,如果我要更新标签或添加新帖子,这将是一场噩梦。

我相信你们中的一位才华横溢的人会给我一些建议。我不知道如何设计这个。

在我看来,缓存整个页面或页面片段是最好的方法。

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

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

来自yii文档

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

依赖关系可以由CCacheDependency的实例或其子类指定。对于您的特定需求,您可以使用CDbCacheDependency和类似的sql

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

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

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