2016-08-10 4 views
1

私はPlay 2.5.4を使用しています。私は、CacheAPIを使用して、現在ログインしているユーザーを保存するようにしたばかりです。これは、ページリクエストに対して複数回必要とされるためです。このオブジェクトをcache.set()を介してキャッシュに追加しました。私はこれでうまく動作している。Play 2.5+とCacheAPI

このユーザーオブジェクトを管理者のアカウントとは異なる権限またはロールに更新すると、ユーザーが適切な権限またはロールを取得できるようにそのユーザーのキャッシュオブジェクトを無効にする必要があります。

ユーザーのキャッシュを更新する方法を教えてください。 複数のWebサーバーでどのように行うことができますか?

ありがとうございました!

+0

どのようにユーザーをキャッシュしますか?このキャッシュのキーは何ですか?.. – MipH

+0

私は、フードの下でEHCacheを使用するPlayのcache.set()とcache.get()を介してキャッシュしています。ユーザーがログインすると、ユーザーのID(プライマリキー)がセッションに格納され、そのユーザーのIDを使用してキャッシュキーを介してユーザーオブジェクトをキャッシュから取得します。 – Mule

答えて

1

どのようにしてユーザーのキャッシュを更新できますか?

もう一度追加してください。私は複数のWebサーバー間でそれを行うことができますどのようにキー

cache.set(user.getId(), user); 

としてユーザーIDを使用していると仮定すると?

これは全く異なる質問です。デフォルトではEhCacheがキャッシュプロバイダとして使用され、プレイキャッシュAPIはデフォルトで分散キャッシュを作成しません。

私はEhCacheにあまり知られていませんが、別の製品の分散キャッシュ(つまり複数のサーバー間のキャッシュ)をサポートしていると思いますし、レプリケーションもサポートしています。だから最初にそれを調べて、それがあなたに合っているかどうかを調べることができます。

Cache APIの実装を作成し、EhCache/Terracota/Memcached/HazelCastを使用して必要なセットアップを行うこともできます。

もう1つのオプションは、Akka Clustering/PubSub拡張機能を使用し、キャッシュの無効化(つまり、サーバー1のキャッシュを無効にする - すべてのサーバーがそのキャッシュを無効にするためのブロードキャストメッセージを無効にすること)です。あなたがAkkaとPubSubの拡張に慣れていない限り、これはおそらく実装が難しいでしょう。

最後の手段として、余裕があれば、短い有効期限(例:1分)でキャッシュを設定できます。これは、アプリケーションで期限切れのオブジェクトが期限切れになっていると見なすことができる場合は、最も簡単な方法です。

+0

お返事ありがとうございます。私は、セッションのキーを使用してユーザーオブジェクトを取得するために、そのユーザーのキーを保持するセッションを使用して、キャッシュの私の1サーバーのインスタンスを持っています。 ... session.put( "USER_ID"、user.id)...その後、cache.get( "CACHED_USER" + sessiong.get( "USER_ID"))...これらの行に沿って何かを取得しますが、 PlayはEHCacheを使用するので、EHCacheのクラスタ化された実装をチェックします。助けてくれてありがとう。 – Mule

関連する問題