3

ヘイホー、

現在、グアバを使用してユーザーをキャッシュしています。したがって、私の質問は、キャッシュされたオブジェクトに特定の属性値がある場合、グアバでエントリの削除を制限できるかどうかです。たとえば、user.isOnline() が true を返した場合、特定の時間 (.expireAfterAccess(KEEP_LOADED, TimeUnit.SECONDS)) の間アクセスされていなくても、ユーザーは削除されません。

編集:

私は CacheBuilder.weighter(...) の javadoc でこれを見つけました:

エントリの重みがゼロの場合、サイズベースの削除は考慮されません (ただし、他の方法で削除される場合もあります)。

しかし、ユーザーがオンラインの場合、ユーザーを強制退去させたくありません。

基本的に、次の方法でユーザーをキャッシュします。

        this.cache = CacheBuilder.newBuilder()
            .maximumSize(MAX_CACHED_USERS)
            .expireAfterAccess(KEEP_LOADED, TimeUnit.SECONDS)
            .build(new UserLoader(core));

編集:

OK、重み付けを使用してキャッシュのサイズを制限できます。オンラインのすべてのユーザーに対して 0 を返し、それ以外のすべてのユーザーに対して 1 を返すことができます。これにより、キャッシュはオンライン ユーザーを保持します。ただし、 maximumSize と expireAfterAccess を使用すると便利です。ただし、 CacheBuilder.weighter(...) は、古いユーザーを追い出すために expireAfterAccess(...) 設定をブロックしません。

編集:

何らかの方法で立ち退きをキャンセルすることは可能かもしれませんが、方法はわかりません:/

関連: Guava RemovalListener からエントリを再挿入しても安全ですか?

マックス

4

1 に答える 1