Флаг / индикатор попадания в весенний кэш

#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. Вы можете использовать любые такие поставщики кэширования.