2

我是 Guava 的新手,我想返回逗号分隔的用户列表,本质上是一个String。我正在使用一个第三方 API 来获取列表。如果用户查询,我想缓存该列表并返回整个列表。

我在网上看了几个例子,他们使用LoadingCache<k, v> and CacheLoader<k,v>. 我没有任何第二个参数,并且用户名是唯一的。我们的应用程序不支持对用户的个人查询

有什么味道/我可以 twikLoadingCache可以让我这样做吗?就像是

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 回答