Кэширую несколько запросов одним методом
@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) {
...
}




Это работает для меня
@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) {
...
}
Укажите аргумент метода, который будет использоваться в качестве ключа кеша (или установите кеш, чтобы удалить все).