В чем разница между @CacheEvict(...) и @CacheEvict(value, allEntries)?

Я заметил несколько строк @CacheEvict("Настройки") в некотором исходном коде, и мне было любопытно, делает ли то же самое, что и CacheEvict (значение = "Настройки", allEntries = true)?

2 ответа

Решение

Когда @CacheEvict указан без key атрибут, все параметры метода используются для создания ключа для записи, которая будет исключена, поэтому

@CacheEvict("Settings")
public String doThing(String foo, Integer bar) {
    // ...
}

... выселит запись с помощью составного ключа {foo, bar}. Генератор ключей по умолчанию, используемый для создания составного ключа: SimpleKeyGenerator, который возвращает SimpleKey экземпляры, которые содержат ссылки на параметры метода для сравнения.

Если метод не имеет параметров, ключ по умолчанию SimpleKey.EMPTY,

Атрибут allEntries не может быть установлен в true если вы укажете key атрибутов; они взаимоисключающие. Если установлено true все записи в кэше будут удаляться каждый раз, когда вызывается аннотированный метод.

Так...

@CacheEvict("Settings", allEntries = true)
public String doThing(String foo, Integer bar) {
    // ...
}

... опустошит Settings кэшировать каждый раз, когда метод вызывается, независимо от параметров метода.

Просто посмотрите на его Javadoc.
Вы заметите значение по умолчанию для allEntries является false, Так что нет, это не одно и то же.
использование allEntries = true только когда вы хотите новый кеш каждый раз, когда выполняется операция.

Все ли записи внутри кеша удалены. По умолчанию удаляется только значение под связанным ключом.

Если вы хотите увидеть детали реализации, просто посмотрите на Coffeine.

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