2016-03-04 3 views
1

Мой прецедент заключается в том, что мне нужно реализовать кеш поверх службы, которая должна истекать через определенные промежутки времени (с момента создания).Есть ли какой-либо сторонний java-кеш, который обеспечивает контроль над событием истечения срока?

И если срок действия истек, то поиск службы должен быть выполнен для получения последней записи. позволяет вызвать обновление службы.

Но, скажем, если обновление службы завершается с ошибкой, тогда я должен иметь возможность использовать устаревшие данные в кеше.

Но поскольку кеш уже истек, у меня нет этой записи.

Итак, я думаю, что контроль истечения срока хранения кеша и кэша истекает только в том случае, если служба доступна для получения последних данных, иначе не удаляйте эту запись.

Я искал кеш Google Guava, но он предоставляет только removeListener, который просто уведомляет меня об этом событии, но я не могу контролировать это событие.

Есть ли какая-либо сторонняя реализация кеша, которая может служить моей цели?

+0

Похоже, вы не хотите истечения срока действия, но 'refreshAfterWrite', поскольку вы не хотите, чтобы запись удалялась (обновлялось только ее значение). –

+0

Does ** refreshAfterWrite ** обновлять только одну запись после заданной продолжительности времени или всего кеша? И если какое-либо исключение бросается во время обновления, то будет ли предыдущая запись сохранена, как есть, или будет выбрано исключение? И я проверил, он требует асинхронного переопределения метода reload(). Не могли бы вы объяснить мне, почему асинхронно? –

+0

Это запись, предыдущее значение возвращается во время перезагрузки и выполняется либо в потоке первого вызывающего, либо может быть полностью асинхронным. Если вам требуется полное периодическое обновление, проще всего просто использовать «ScheduledExecutorService». –

ответ

1

Эта семантика упругости и прочности реализована в cache2k. Мы используем это в производстве довольно долгое время. Установка выглядит

CacheBuilder.newCache(Key.class, Value.class) 
    .name("myCache") 
    .source(new YourSourceImplementation()) 
    .backgroundRefresh(true) 
    .suppressExceptions(true) 
    .expiryDuration(60, TimeUnit.SECONDS) 
    .build(); 

С exceptionExpiryDuration вы можете установить более короткий интервал для повторной попытки. Был такой же вопрос в отношении SO, на который я также ответил, см .: Is it possible to configure Guava Cache (or other library) behaviour to be: If time to reload, return previous entry, reload in background (see specs). Там вы найдете более подробную информацию об этом.

Независимо от того, какой кэш вы используете, вы столкнетесь с множеством проблем, поскольку обработка исключений в целом и создание надежных и устойчивых приложений нуждается в некоторых размышлениях в деталях.

Тем не менее, я еще не совсем доволен решением, так как я думаю, нам нужно больше контроля, например. как долго должны храниться данные. Кроме того, кэш должен иметь некоторое оповещение, если в нем есть устаревшие данные. Я поразмыслил над тем, как улучшить это здесь: https://github.com/cache2k/cache2k/issues/26

Отзыв очень приветствуется.