1

したがって、たとえば:

CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterAccess(1, TimeUnit.MINUTES)
            .expireAfterWrite(1, TimeUnit.MINUTES)
            .build(new CacheLoader<String, Object>() {
                @Override
                public Object load (String key) {
                    return ...;
                }
            });

返されたインスタンスを呼び出すinvalidate(key)場合、への後続の呼び出しはgetUnchecked()、少なくとも1分が経過するまで常に前の値を使用します。これにより、load(key)再度呼び出されます。cleanUp()直後への呼び出しinvalidate()も効果がないようです。

この機能を誤って使用していますか、それともキャッシュがどのように機能しているかについて何かを理解していませんか?

http://code.google.com/p/guava-libraries/wiki/CachesExplainedによる

「いつでも、エントリが削除されるのを待つのではなく、キャッシュエントリを明示的に無効にすることができます。これは次のように実行できます。

個別に、Cache.invalidate(key)を使用して"

無効化の呼び出しが優先され、時間が1分未満であっても、エントリは常にエビクションの対象になります(つまり、次のgetUnchecked呼び出し)。

編集::私は自分の問題を理解しました。上記の観察は確かに真実であり、キャッシュの予想される性質です。ただし、私の特定の問題は、パラメーターなしで(すべてを無効にする)invalidateAll()を呼び出す必要があるときに、空のリスト(何も無効にしない)でinvalidateAll([])を呼び出すことがあるということでした。invalideAll([])はinvalidateAll()と同等であるとほぼ期待しますが、それがどこで混乱を招くかはわかりました。

4

1 に答える 1

3

...あなたがあなたの期待を説明しているのか観察を説明しているのかはわかりませんがinvalidate、エントリをすぐに削除する必要があります-別のクエリを待たずに-そしてそのキーの次のクエリで値を強制的に再ロードする必要があります。それが起こらない場合、それはバグです。

于 2012-11-09T18:10:51.320 に答える