2016-08-18 5 views
0

私はconfig.ymlファイルのDoctrineCacheBundleに複数の名前空間を設定できることを知っています。しかし、1つのドライバを使用できますが、複数の名前空間を使用できますか?DoctrineCacheBundle cacheDriverで複数の名前空間を使用するには?

私のアプリでは、すべてのエンティティのすべてのクエリをキャッシュしたい場合があります。問題は、作成/更新アクションを実行しながらキャッシュをフラッシュすることです。キャッシュされたクエリの一部だけをフラッシュしたい。私のアプリは複数のクライアントによって使用されます。したがって、クライアントがArticle Entityなどのデータでsthを更新すると、このクライアントのキャッシュのみをArticleに対してのみクリアします。私は各クエリに適切なIDを追加し、手動で削除することができますが、クエリは動的に使用されます。 APIのモバイルアプリでは、DBがデータを返すバージョン番号を送信するので、どのIDが最後に使用されるのか分かりません。

答えて

1

残念ながら私はあなたがしたいことは、いくつかの構成魔法で解決できるとは思わない。何らかの索引付きキャッシュが必要な場合、そのためにはより強力なツールを見つける必要があります。

doctrines second level cacheをご覧ください。今はどれくらい良いのか分かりません(ベータ版のときに一度試してみてください)。

独自のキャッシュマネージャを構築することもできます。もしあなたが私がredisを使用することをお勧めします。データ構造はインデックスを保持するのに役立ちます(memcachedでシミュレートできますが、より多くの作業が必要です)。私は索引で何をやったのですか?

あなたはclient_1_articlesのようなキーを持っています。ここで1はクライアントIDです。そのキーでは、クライアント1の記事のIDをすべて保存します。すべての記事IDには、article_xのようなキーがあります(xは記事のIDです)。この例では、client_1_articlesは、ある時点でクライアント1からの記事のすべてのキャッシュを無効にするのに役立つ初歩的なインデックスです。

上記の例の抽象的な実装は、おそらく

-composedインデックスを使用してキャッシュを超える構造、 'client_1:category_1' => {article_1、article_2}つの項目のために、例えば

-multipleインデックス: 'category_1' => {article_1、article_2、article_3} 、 'client_1' => {article_1、article_3}

-etc。

これは何らかの方法でお手伝いします。少なくともそれは私の同様の問題に対する解決策でした。

プロジェクト、

アレクサンドルCosoi

+0

ですから、クエリをしながらコントローラーで、その後、例えばSncRedisBundleに使用metadata_cacheためDoctrineCacheBundleで使用するように設定し、RESULT_CACHE、query_cacheとする意味を持つ幸運、 $ cache = $ this-> container-> get( 'redis_cache');でキャッシュします。 $ cache-> save( 'article_1'、$ article);このキーをKEYに保存してRedisに保存しますか? $ redis-> append( 'client_1'、 'article_1')のように。そして、更新を行うときに$ redis-> delete(array( 'key3'、 'key4'))で適切なキーを削除するだけです。 ? – Tom

+0

そういうもの、そうです。結果キャッシュが必要かどうかわかりません。私はそれにいくつか問題があった。私は、メタキャッシュ、クエリキャッシュを使用し、私は自分で結果キャッシュを世話します。 –

関連する問題