#spring #ehcache #spring-cache
#spring #ehcache #spring-cache
Вопрос:
Я использую Spring Cache для кэширования некоторых объектов через @Cacheable. Тем не менее, 1 из требований требует, чтобы я мог знать, был ли возвращенный объект получен из кэша или стандартного вызова. Есть ли какой-либо флаг или индикатор, который устанавливается, который я могу использовать для проверки этого?
Я видел прошлые вопросы, касающиеся обращений к кэшу, которые регистрируются всякий раз, когда есть обращения к кэшу, но это не очень полезно для моей ситуации. В настоящее время я использую Spring Cache с Simple Provider и открыт для использования любых внешних менеджеров кэша, которые могут это сделать.
Ответ №1:
Да, мы можем узнать, является ли это попаданием в кэш или промахом в кэше (прямой вызов вызова REST или вызов базы данных), используя флаг.
При использовании @Cacheable
он всегда сначала проверяет кэш, прежде чем выполнять метод, если он найден в кэше, он пропустит выполнение метода, где as @CachePut
работает немного иначе, где он будет выполнять выделенный метод и обновлять кеш, поэтому он всегда будет пропускать кеш.
Например:
private volatile boolean cacheMiss = false;
public boolean isCacheMiss(){
boolean cacheMiss = this.cacheMiss;
this.cacheMiss = false; //resetting for next read
return cacheMiss;
}
protected void setCacheMiss(){
this.cacheMiss = true;
}
@Cacheable("Quotes")
public Quote requestQuote(Long id) {
setCacheMiss();
//REST CALL HERE
return requestQuote(ID_BASED_QUOTE_SERVICE_URL,
Collections.singletonMap("id", id));
}
cacheMiss
переменная выдает статус, независимо от того, из кэша она или нет.
Здесь обсуждается весеннее кэширование с GemFire, основным поставщиком кэширования является Pivotal GemFire. Вы можете использовать любые такие поставщики кэширования.