2016-03-25 1 views
2

Я пытаюсь создать кеш с использованием библиотеки кэша guava. Одним из моих основных требований является то, что я хочу установить истечение кеша после функции CacheLoader.load (..) вместо того, что есть в большинстве примеров, с которыми я столкнулся в Интернете, например, ниже.Guava cache: как установить срок действия на 'CacheLoader.load()', а не во время CacheBuilder.newBuilder()?

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

ИЛИ Есть ли лучший вариант, чем доступный кэш Гуава для этой цели?

+2

Нет, нет никакого способа, чтобы установить для каждого входа сроком действия с кэшем гуавы в. См. Https://github.com/google/guava/issues/1203 для обсуждения. –

+0

Спасибо @LouisWasserman. –

+1

Возможный дубликат [Google Guava Cache - изменение значений тайм-аута выключения во время выполнения] (http://stackoverflow.com/questions/26843814/google-guava-cache-change-the-eviction-timeout-values-during-run -time) – rkosegi

ответ

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 ....

+0

спасибо cruftex. Мы это проверим. –