1

私は長い間ウェブを検索してきましたが、キャッシュに複数のタグを追加して、データベースが更新されたときにキャッシュを削除できるようにするキャッシュシステムが見つかりません。そのようなものが存在するかどうか誰かが知っていますか? ?

やりたいことの詳細をお伝えします。MySQL データベースで非常に重いクエリを実行する PHP Web サイトがあります (一部のページを表示するために 4000 を超えるクエリ)。したがって、これらのクエリをキャッシュして、データベースの使用を軽減するという考えです。一方、データベースが更新されたら、これらの情報をできるだけ早く更新する必要があります。

スコープは、更新が必要なキャッシュのみをクリアし、一度にすべてを空にするわけではありません。これは、1 つのページのみに影響する行にわずかな変更があったためです。タグでこれを解決する方法はありますか?

私はすでに Fastcached と BrennoCache を見てきましたが、許可されるタグは 1 つだけです…</p>

[編集]: FastCache を使用し、TTL を使用し、命名システムですべてのキャッシュ要素にタグを付けて、空にする必要があるキャッシュを空にすることで終了しました。キャッシュは可能な限り最小の情報部分にも適用されています。これは、キャッシュのトーンを意味しますが、情報キャッシュはほとんどありません。つまり、適切なビットだけを空にするのがはるかに簡単になります。このようにして、1 ページの 4233 クエリから 17 クエリに増やすことができました。

4

2 に答える 2

2

Microsoft には AppFabric と呼ばれるキャッシュがあり、キャッシュ内のアイテムにタグのリストを割り当てることができます。http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx

元の質問/問題に...

私の経験から、プロアクティブなエビクションのためにキャッシュ内のアイテムにタグを付けようとしないことを強くお勧めします。

数年前に AppFabric であなたがやっていることとまったく同じことをしようとしましたが、多くの問題に遭遇しました。私の例として、製品を販売する Web サイトを考えてみましょう。各製品には ID があります。

問題:

  1. 製品は、私たちのクエリのいたるところにあることになります。個別の商品ページをご用意しております。カテゴリの製品。延々と続く。100 個の製品を含むキャッシュされたアイテムがある場合、100 個のタグがありますか? これはすぐに管理が難しくなります。

  2. 1 つの製品が 100 の異なるキャッシュ オブジェクトにあるとします。キャッシュされたすべてのアイテムを見つけて削除するのにかかる時間内に、アイテムが再び変更された可能性があります! つまり、変化するデータを扱うときは、トランザクションについて考える必要があります。キャッシュを使用して「書き込み」を行っている場合、別の書き込みが競合しないようにブロックしますか?

  3. (2) から複雑さを理解できたとしても、実行にはまだ時間がかかると思います。これをユーザーにどのように反映しますか?

キャッシュに関する私のアドバイス:

  1. 常に TTL を使用し、可能であればキャッシュ内のアイテムを期限切れにします。考え方を変えて、このアプローチを使用するように一生懸命努力してください。データの 90% をこのアプローチに移行できれば、コードは非常にシンプルになり、保守も容易になります。

  2. (1) に移動できないアイテムについては、それらがキャッシュ内の1 つの場所にあることを確認してください。これは、アイテムにタグを付ける必要がないことを意味します。すべてがその項目を参照するようにするには、多少のリファクタリングが必要ですが、それだけの価値はあります。そうすれば、アイテムを期限切れにする必要があるときに、1 つの呼び出しを行うだけで簡単です。それが完了すると、全員が最新のデータを取得します。

于 2013-11-09T16:16:56.863 に答える
0

memcached を使用してクエリの処理結果を保存し、データベース更新スクリプトを使用して、memcache タグをクリアするか、できれば最新の処理済みデータで再生成します。

于 2013-11-08T22:25:23.417 に答える