Флаг / индикатор попадания в Spring Cache

Я использую Spring Cache для кеширования некоторых объектов через @Cacheable. Однако одно из требований требует, чтобы я мог знать, был ли возвращенный объект из Cache Hit или стандартного вызова. Есть ли установленный флаг или индикатор, который я могу использовать для проверки?

Я видел прошлые вопросы о попаданиях в кеш, которые регистрировались всякий раз, когда есть попадания в кеш, но это не очень полезно для моей ситуации. В настоящее время я использую Spring Cache с Simple Provider и открыт для использования любых внешних менеджеров кеша, которые могут это сделать.


person dirkaka    schedule 03.09.2020    source источник


Ответы (1)


Да, мы можем узнать, является ли это попаданием в кеш или промахом в кеше (прямой вызов REST-вызова или вызов базы данных), используя флаг.

Используя @Cacheable, он всегда сначала проверяет кеш, прежде чем он выполнит метод, если он найден в кеше, он пропустит выполнение метода, где, поскольку @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 переменная дает статус, независимо от того, из кеша он или нет.

Здесь обсуждается Spring Caching with GemFire ​​, основным поставщиком кеширования является Pivotal GemFire. Вы можете использовать любых таких провайдеров кеширования.

person Dinesh Dontha    schedule 03.09.2020