番石榴缓存:如何设置' CacheLoader.load()'而不是在CacheBuilder.newBuilder()期间?

时间:2016-03-25 19:30:27

标签: java caching guava

我正在尝试使用guava缓存库创建缓存。我的主要要求之一是我想在CacheLoader.load(..)函数之后设置缓存过期,而不是我在网络上遇到的大部分示例,如下面的那样。

LoadingCache<String, MyClass> myCache = 
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterWrite(10, TimeUnit.Minutes).build(cacheLoader);

原因是CacheLoader.load(...)函数从数据库中检索的对象包含到期数据。所以我想使用这些信息而不是一些&#34;随机&#34;静态值。

我想要这样的东西。

LoadingCache<String, MyClass> myCache = 
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).build(cacheLoader);

...

CacheLoader meCacheLoder = new CacheLoader<String MyClass>(){
   @Override
   public MyClass load(String key) throws Exception {
      // Retrieve the MyClass object from database using 'key'
      MyClass myObj = getMyObjectFromDb(key);  
      int expiry = myObj.getExpiry();

         // Now somehow set this 'expiry' value with the cache
         ????

      return myObj;
   }
 };

OR 为此目的,还有比Guava缓存更好的选择吗?

1 个答案:

答案 0 :(得分:1)

路易斯已经指出,番石榴没有这样的特征。

例如,您可以使用EHCache或cache2k。对于cache2k,我可以为您提供快速指示,因为这是我们经常使用的核心功能:

您可以在值对象上实现接口ValueWithExpiryTime,即:

interface ValueWithExpiryTime {

  long getCacheExpiryTime();

}

或者,您可以注册EntryExpiryCalculator来提取时间值。缓存的构建如下:

Cache<Key, Value> cache = 
  CacheBuilder.newCache(Key.class, Value.class)
    .expiryCalculator(new EntryExpiryCalculator<Key, Value>() {
        @Override
        public long calculateExpiryTime(
            final Key key, final Value value, 
            final long loadTime, final CacheEntry<Key, Value> oldEntry) {
          return value.getExpiry();
        }
      }
    )
    .build();

时间是自纪元以来以毫秒为单位的标准长型。默认情况下,到期时间不会在指定时间发生,而是在零或几毫秒之后,具体取决于您的机器负载。这是最有效的模式。如果这是一个问题,请添加sharpExpiry(true)

免责声明:我是cache2k的作者......