繁体   English   中英

Guava 缓存:如何在“CacheLoader.load()”而不是在 CacheBuilder.newBuilder() 期间设置过期时间?

[英]Guava cache: how to set expiration on 'CacheLoader.load()' instead of during CacheBuilder.newBuilder()?

我正在尝试使用番石榴缓存库创建缓存。 我的主要要求之一是我想在 CacheLoader.load(..) 函数之后设置缓存到期,而不是我在网上遇到的大多数示例,如下所示。

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

这样做的原因是 CacheLoader.load(...) 函数从数据库中检索的对象包含过期数据。 所以我想使用这个信息而不是一些“随机”静态值。

我想要这样的东西。

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;
   }
 };

或者为此目的,是否有比 Guava 缓存更好的选择?

正如路易斯已经指出的那样,番石榴中没有这样的功能。

例如,您可以使用 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();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM