Spring выселить кеш из метода с другой подписью

Кэширую несколько запросов одним методом

    @Override
    @Cacheable(cacheNames = "user-actions")
    public UserAction getUserAction(UUID userId) {
        ...
    }

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

    @CacheEvict(cacheNames = "user-actions")
    public void evictUserLevel(UUID userId) {
        log.info("Cache user-actions has been evicted");
    }

Но есть ли способы удалить кеш, если я не передаю userId методу, в котором кеш будет удален, или если у него более одного параметра? Это не работает:

    @CacheEvict(cacheNames = "user-actions")
    public void processEvent(UserEvent event, UUID userId) {
        ...
    }

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

M. Deinum 02.04.2021 10:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
30
2

Ответы 2

Это работает для меня

    @CacheEvict(cacheNames = "user-events", key = "#root.args[1]")
    public void processEvent(UserEvent event, UUID userId) {
        ...
    }

root.args - означает аргументы метода, а [1] - индекс аргумента

Цитата из документация

Генерация ключа по умолчанию

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

  • Если параметры не указаны, верните 0.

  • Если указан только один параметр, верните этот экземпляр.

  • Если указано больше одного параметра, вернуть ключ, вычисленный из хешей всех параметров.


Следовательно, подпись ниже не работает, поскольку ключ вычисляется из event и userId.

@CacheEvict(cacheNames = "user-actions")
public void processEvent(UserEvent event, UUID userId) {
   ...
}

But is there ways to evict cache if I don't pass userId to method in which cache will be evicted, or if it has more than one parameter?

Без параметра

установите allEntries=true, который очистит все записи.

@CacheEvict(cacheNames = "user-actions", allEntries = true)
public void evictAll() {
}

Для более чем одного параметра

укажите параметр для key, подробности см. в Объявление о создании специального ключа.

@CacheEvict(cacheNames = "user-actions", key = "#userId")
public void processEvent(UserEvent event, UUID userId) {
...
}

Другие вопросы по теме