問題タブ [google-guava-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Guava LoadingCache を使用してイベント頻度を検出する方法
イベントの頻度を検出する必要があります。たとえば、X 秒以内に N 個の同一のイベントが発生しました。
私の検出プロセスは 24 時間 365 日継続的に実行されます。
私の初期設計ではConcurrentHashMap
、キーはイベント ID を表すカスタム値オブジェクトであり、値はJoda DateTime
イベントが発生したときの値です。
このアプローチは、イベント頻度の検出にはうまく機能しましたが、「古い」イベントを削除するためのエビクション プロセスも実装する必要がありました。
私が発見した改善されたアプローチをグーグルで検索するとcom.google.common.cache.Cache
、関連するものとして有望に見えましたCacheBuilder
が.expireAfter#####()
、キャッシュのすべての get メソッドは非推奨です。どうやら私は使用する必要がありますLoadingCache
。
メソッドのすべての例はLoadingCache
load()
、データベースまたはその他の「高価な」操作にアクセスして、ロードする値を取得することを示しています。これらのどれも私のユースケースに適合しません。キャッシュに入力する必要があるキーと値があります。値がバックエンド データストアに存在しない場合、キャッシュ ミスでイベントを「ロード」するにはどうすればよいですか?
私は使用することになっていますcache.put(Key, Value)
か?
java - Guava の CacheBuiler を ConcurrentLRUCache として使用する方法
つまり、このキャッシュはスレッドセーフであり、LRU プロパティがあります。 CacheBuilder Guava Docsを参照してください。
私の仮定は、同じキーを持つ複数のスレッドが同時に起動された場合です。これには CyclicBarrier が使用され、1 つのスレッドが put() をキャッシュに入れ、他のスレッドは待機します。その後、残りのスレッドは、値がすでにキャッシュにあり、 put() がキャッシュにないことを確認します。
これは、各スレッドが新しい Object() を作成してキャッシュに入れるため、以下のコードには当てはまりません。テストを実行してコンソールを確認し、毎回異なるオブジェクトが作成されることを確認します。
CacheBuilderの使用方法に本質的に問題はありますか?- 私が使用できるより良い方法はありますか?
- 使用できるライブラリはありますか?
よろしくお願いします!
java - 古いキーを考慮した Guava キャッシュ
Guava キャッシュの問題に直面しています。キャッシュに要素が 1 つしかない場合は問題ありません。しかし、2番目の要素をロードすると、以前のエントリのキーで選択しようとしています
ログには次のように記載されています。
たとえば、method("1", 2) を呼び出すと、値がキャッシュに読み込まれ、その後キャッシュから取得できます。メソッド ("3", 4) を呼び出しますが、これはキャッシュにないため、getValue() が呼び出され、ログにメソッド ("1", 2) のキーが出力されます。
どこが間違っていますか?
java - LoadingCache expireAfterWrite が期待どおりに機能しない
私はこのようなローディングキャッシュを持っています:
しかし、テストするためにこのようなことをすると:
まだゼロではなく2になっています。なんで ?120 秒以上経過した後、間違っていなければサイズがゼロになっているはずです。
MyCacheLoader
MyRemovalListener
java - 静的メソッドを呼び出すクラスの単体テスト
クラス「B」の静的メソッドを呼び出すクラス「A」を単体テストしようとしています。クラス「B」には、基本的に、キーを指定してキャッシュから値(オブジェクト)を取得するか、サービスアダプターを使用してオブジェクトをキャッシュにロードする(キャッシュミスの場合)Googleグアバキャッシュがあります。service-adapter クラスには、オブジェクトを取得するための他の自動配線された依存関係があります。
これらは説明目的のためのクラスです:
クラスA
クラスB
サービス アダプタ クラス
統合テストを正常に実行し、キャッシュから (またはキャッシュに) 値をフェッチ (またはロード) することができます。ただし、クラス A の単体テストを作成できません。これは私が試したものです。
クラス A の単体テスト
単体テストを実行すると、mainService.getTheObject(key) の呼び出しが行われる ServiceAdapter クラスで NullPointerException が発生して失敗します。
クラス A の単体テスト中に ServiceAdapter の依存関係をモックするにはどうすればよいですか。B.
私は根本的に間違ったことをしていると確信しています。クラス A の単体テストはどのように記述すればよいですか?
java - Guava Cache による確率的早期有効期限切れ
で作成された Guava キャッシュがありexpireAfterWrite(20, TimeUnit.MINUTES)
ます。キャッシュは、作成時に数十のエントリで初期化されます。値が期限切れになると、クライアントは外部サービスを呼び出してキャッシュを更新することになっています。
問題は、初期化されたすべての値が同時に 20 分後に期限切れになり、クライアントがほとんど同じインスタンスでサービスを何十回も呼び出すことです。
私はこれが起こることを望んでいません。これを回避するための 1 つの方法は、確率的にエントリを TTL より少し早く期限切れにして、サービスが同時に多くのヒットを受けないようにすることです。
残念ながら、Guava キャッシュでこれを行うオプションはありません。少なくとも Wiki や Javadoc からは何も表示されませんでした。他に利用可能なライブラリはありますか?この目的のために独自のキャッシュの実装を作成することは避けようとしています。
java - com.google.common.collect.MapMaker の有効期限
最後のリリースのグアバをダウンロードしました
クラスMapMakerにはexpiration
、私が便利だと思ったメソッドがもうなく、代わりのメソッドが見つかりませんでした。
java - Java キャッシング - Map を使用するか、Graph を使用するかの選択
私のJava Springアプリケーションでは、構成メタデータのインプロセス/インメモリキャッシュを構築する必要があります。これは次のように構成されています:
質問:
この目的により適しているのは、Map、Google Guava の ValueGraph、EhCache、またはその他の手法でしょうか?