2

私はGuavaが初めてで、ユーザーのコンマ区切りリストを基本的にStringで返したいと思っています。リストを取得するために 1 つのサードパーティ API を使用しています。そのリストをキャッシュし、ユーザーがクエリを実行した場合にそのリスト全体を返したいと考えています。

オンラインでいくつかの例を見たところ、LoadingCache<k, v> and CacheLoader<k,v>. 2 番目の引数はなく、ユーザー名は一意です。私たちのアプリケーションは、ユーザーに対する個別のクエリをサポートしません。

それを可能にする / I can twik のフレーバーはありますLoadingCacheか? 何かのようなもの

LoadingCache<String> 
.. some code .. 
CacheLoader<String> { 
/*populate comma separated list_of_users if not in cache*/ 
return list_of_users
}
4

1 に答える 1

4

間違いなく見てきたように、 a のパターンLoadingCacheは次のとおりです。

 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(1000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   // ... other configuration builder methods ...
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

サービスがキーを取らない場合は、それを無視するか、定数を使用できます。

 LoadingCache<String, String> userListSource = CacheBuilder.newBuilder()
   .maximumSize(1)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   // ... other configuration builder methods ...
   .build(
       new CacheLoader<String, String>() {
         public Graph load(Key key) {
           return callToYourThirdPartyLibrary();
         }
       });

別の方法でラップすることにより、無視されたキーが存在するという事実をまったく隠すことができます。

  public String userList() {
        return userListSource.get("key is irrelevant");
  }

ユースケースで Guava キャッシュのすべての機能が必要であるとは思えません。一定期間後にキャッシュを期限切れにし、削除リスナーをサポートします。これは本当に必要ですか?代わりに、次のような非常に単純なものを書くことができます。

 public class UserListSource {
     private String userList = null;
     private long lastFetched;
     private static long MAX_AGE = 1000 * 60 * 5; // 5 mins

     public String get() {
        if(userList == null || currentTimeMillis() > lastFetched + MAX_AGE) {
             userList = fetchUserListUsingThirdPartyApi();
             fetched = currentTimeMillis();
        }
        return userList;
     }
 }
于 2016-12-16T17:18:33.817 に答える