13

Guava には優れたキャッシング ライブラリがあることは知っていますが、 cache.getOrElse(query, { /* expensive operation */}). Scalaz のメモも見ましたが、lru の有効期限がありません。

4

3 に答える 3

17

スプレーの人々は、先物を使用するスプレーキャッシングモジュールを持っています。プレーンなLRUバージョンと、明示的な存続時間を指定できるバージョンがあります。その後、エントリは自動的に期限切れになります。

Futuresを使用すると、ブロックしないコードを記述できることは明らかです。しかし、本当にクールなのは、ボーナスとして「雷鳴の群れ」の問題を解決することです。たとえば、キャッシュにない同じエントリに対して、一度に多数のリクエストが届くとします。単純なキャッシュ実装では、100のスレッドがキャッシュ内のそのエントリを見逃し、そのキャッシュエントリに対して同じデータを生成するために実行される可能性がありますが、もちろんその99%は無駄な作業です。本当に必要なのは、1つのスレッドでデータを生成し、100個のリクエスターすべてで結果を確認することです。キャッシュにFutureが含まれている場合、これは非常に自然に発生します。最初のリクエスターはすぐにFutureをキャッシュにインストールするため、最初のリクエスターのみが失敗します。100のリクエスターすべてが、生成された結果に対してそのFutureを取得します。

于 2013-01-30T15:42:40.160 に答える
10

TwitterのScala Utilライブラリで探していたものを正確に見つけました

于 2013-01-28T21:38:10.333 に答える