私は最近、私の php yii Web サイトにブログを追加しました。これは、yii ブログのデモを大幅に変更したバージョンです。私のブログはアクティブ レコードを使用していますが、残念ながら投稿を表示するために約 20 回のデータベース呼び出しを使用しています。これを memcache で高速化したいと思います。その非常識な数の db 呼び出しを取り除くために、できるだけ多くのコンテンツをメモリにキャッシュしたいと思います。すでにスキーマ キャッシングを有効にしています。これにより、呼び出しの数は 12 または 13 程度に削減されますが、それでも多すぎます。
ブログの負荷テストを行っているときに、高負荷下では CPU が制限要因であることがわかりました。ラムはまだたくさんあります。そのため、その余分な RAM の一部を使用することで、CPU の負荷が軽減されることを願っています。そこで memcache の出番です。問題は、それをどのように設計するかです。
コメントとタグを使用して単一の投稿をキャッシュする方法を理解しましたが、それほど難しくありません。私が苦労しているのは、それぞれに多数の投稿があるインデックスページをキャッシュする方法です。ページ 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 をキャッシュする必要があり、タグを更新したり、新しい投稿を追加したりする場合に更新するのは悪夢です。
優秀な方の 1 人が私にいくつかの提案をしてくれると確信しています。私はこれをどのように設計するか途方に暮れています。