10

SpringMVCを使用してWebアプリケーションを作成しています。私は次のようなインターフェースを持っています:

public interface SubscriptionService
{
    public String getSubscriptionIDForUSer(String userID);
}

実際に別のgetSubscriptionIDForUserサービスにネットワーク呼び出しを行って、ユーザーのサブスクリプションの詳細を取得します。私のビジネスロジックは、ロジック内の複数の場所でこのメソッドを呼び出します。したがって、特定のHTTPリクエストに対して、このメソッドに対して複数の呼び出しが行われる可能性があります。そのため、この結果をキャッシュして、同じリクエストに対して繰り返しネットワーク呼び出しが行われないようにします。Springのドキュメントを調べましたが、同じリクエストに対してこの結果をキャッシュする方法への参照が見つかりませんでした。言うまでもなく、同じに対する新しいリクエストの場合、キャッシュは無効と見なされますuserID

私の要件は次のとおりです。

  1. 1つのHTTPリクエストに対して、複数の呼び出しが行われるgetSubscriptionIDForUser場合、実際のメソッドは1回だけ実行する必要があります。他のすべての呼び出しについては、キャッシュされた結果が返される必要があります。

  2. 別のHTTPリクエストの場合、メソッドパラメータがまったく同じであっても、新しい呼び出しを行い、キャッシュヒットを無視する必要があります。

  3. ビジネスロジックは、異なるスレッドから並列にロジックを実行する場合があります。したがって、同じHTTPリクエストに対して、Thread-1が現在getSubscriptionIDForUserメソッド呼び出しを行っている可能性があり、メソッドが戻る前に、Thread-2も同じパラメーターを使用して同じメソッドを呼び出そうとします。その場合、スレッド2は、別の呼び出しを行うのではなく、スレッド1から行われた呼び出しの戻りを待機するように作成する必要があります。Thread-1から呼び出されたメソッドが戻ると、Thread-2は同じ戻り値を取得するはずです。

ポインタはありますか?

更新:私のWebアプリはVIPの背後にある複数のホストにデプロイされます。私の最も重要な要件は、リクエストレベルのキャッシュです。各リクエストは単一のホストによって処理されるため、サービス呼び出しの結果をそのホストにのみキャッシュする必要があります。同じuserIDを持つ新しいリクエストは、キャッシュから値を取得してはなりません。私はドキュメントを調べましたが、それがどのように行われるかについての参照を見つけることができませんでした。私は間違った場所を見ているのでしょうか?

4

4 に答える 4

1

EHCacheはすぐに頭に浮かびますが、結果をサービス層にキャッシュする独自のソリューションを作成することもできます。ここでのキャッシュには、おそらく 10 億のオプションがあります。選択は、タイムアウトする値が必要か、キャッシュを手動で消去するかなど、いくつかの要因によって異なります。複数のアプリ サーバーに分散されたステートレス REST アプリケーションがある場合のように、分散キャッシュが必要ですか。クラッシュや再起動に耐えることができる堅牢なものが必要です。

于 2013-02-06T21:29:48.107 に答える