1

この質問のタイトルは紛らわしいかもしれませんが、問題は単純です。

memcachedをバックエンドとしてZend_Cacheを使用しています。「最後の記事」と「人気の記事」という2つのモジュールがあります。このモジュールは両方ともすべてのページにあり、次のような同様のクエリを使用します。

Select * from table where status = 'published' and category = '' order by dateCreated|/popularity\

私のテーブルにはこれまでに150万行あります。前のクエリで使用しているすべてのフィールドにインデックスがあります。最近の記事を1時間キャッシュし、人気のある記事を4時間キャッシュします。4つのWebサーバー(php5 / apache2)と1つのデータベースサーバー(mysql)があります。テーブルエンジンはinnoDBです。

この問題は、負荷が高い途中でキャッシュが期限切れになり、それらのモジュールが再びキャッシュされるまでWebサイトが使用できなくなる場合があります。私は新しいMYSQLサーバーを持つことができました。

しかし、よりスマートな方法でキャッシュを処理する方法はありますか?たとえば、server1はキャッシュを更新しようとしますが、サーバー2、3、4はキャッシュから同じ値を使用します。

それを行うためのコードを書くことはできますが、Zend_Cacheを使用して直接それを行う方法があるかどうか疑問に思っていました。問題に適用できるデザインパターンがある場合はどうなりますか?

[編集]100台のサーバーにスケールアップできるものが欲しい

4

4 に答える 4

1

キャッシュの有効期限が切れてからHTTPリクエスト中に(または、さらに問題なのは、複数の同時リクエスト中に)再入力されることに依存する代わりに、キャッシュが期限切れにならないようにしないのはなぜですか?

次に、高価なクエリを実行するまでのスクリプトをスケジュールし(1回だけ!)、バックグラウンドでキャッシュを更新します。

于 2011-07-05T21:04:44.800 に答える
1

すべてが可能です :)

分散memcache(serv1,2,3,4)。

serv4はReCacheにのみ使用してください。

「内部のみ」のWebサイトを設定します(ユーザーには表示されません)。

「一部のカテゴリを更新する」部分を削除します。

「最も読まれた記事」を取得するには->apacheアクセスログを解析します。

そして、URLをserver4に再送信します。

アクセス時間があるので、2〜6時間前など必要な部分だけを入手できます。

分散memcacheは、その値をserv1,2,3に自動入力します。

于 2011-07-06T14:35:50.870 に答える
1

それはあなたが実行している実際のクエリですか?

Select * from table where status = 'published' and category = '' order by dateCreated|/popularity\

高度なキャッシュソリューションを検索する代わりに、このクエリがデータベースサーバーに負荷をかける理由を確認してください。1.5m行のテーブルは珍しいことではありません。

LIMIT句を追加しようとしましたか、それとも必要な列のみを選択しましたか?

Select col1, col2 from table where status = 'published' and category = '' order by dateCreated LIMIT 5

これにより、データベースとWebサーバー間のトラフィックが大幅に削減されます。

于 2011-07-06T18:57:21.393 に答える
0

最後に、Zend_Cache_Backend_Libmemcachedから継承するクラスを実装しました。load()メソッドをオーバーライドしています。

私の各サーバーには、serv01、serv02、serv03、serv04などの一連の番号で終わるホスト名があります。主なアイデアは、各サーバーがキャッシュが異なる時間に期限切れになったと見なすということです。たとえば、serv01は、キャッシュが実際に期限切れになる20分前に期限切れであると見なし、serv02は15分、serv03は10分、serv045分になります。

そうすることで、各サーバーでキャッシュが同時に更新されることはなく、1つのサーバーがダウンしている場合、キャッシュは別のサーバーによって更新されます。

于 2011-07-12T15:50:18.553 に答える