1

環境

ehcache 内に java.util.List を保存しています。

Key(String) --> List<UserDetail>

順序付きリストには、最もアクティブなユーザーのトップ 10 ランキングが含まれています。

問題

同時のサードパーティ クライアントがこのリストを要求している可能性があります。ランキングに関しては、できるだけ最新である必要があります。したがって、ユーザーのアクティビティによってランキングが変更された場合、キャッシュ内の順序付けされたリストを長期間にわたって失効させてはなりません。新しいリストを再計算したら、キャッシュ内のリストをすぐに置き換えたいと思います。

複数の同時クライアントがランキングを要求している忙しいシナリオを考えてみましょう。次のような方法でキャッシュ項目を置き換えるにはどうすればよいですか? クライアントは、おそらく古いスナップショットをプルし続けることができます。null 値を取得することはありません。

キャッシュに書き込むサーバー スレッドは 1 つだけです。

4

2 に答える 2

4

問題が何であるかわかりません。キャッシュ アイテムを置き換えると、クライアントはその新しいキャッシュ アイテムを取得します。その時点までは、古いキャッシュ アイテムをプルします。

実際にアイテムをキャッシュから削除してから置き換えない限り、null キャッシュ アイテムが返されることは決してありません。

EHCache がそのように機能する場合、スレッドセーフであることを考えると、根本的に壊れていると考えます!

于 2010-04-01T10:40:46.630 に答える
3

新しいリストをキャッシュに保存するだけです。get を次に呼び出すと、それが返されます。

確認する必要があるのは、キャッシュから返されたリストを誰も編集しないことだけです。たとえば、サーバー スレッドでは、リストをコピーする必要があります。

List workingCopy = new ArrayList ((List)cache.get(key));
... modify list ...
cache.put (key, workingCopy);
于 2010-04-01T10:40:56.880 に答える