Аннотация @Cacheable, использующая одно и то же значение в различных методах - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать аннотацию Spring @Cacheable.

 @Cacheable(value="users")          
public List<User> findAll() {
    System.out.println("Looking for All users : ");
    return userRepository.findAll();
}

@Override
@Cacheable(value="users")  
public User findOne(String userId) {
    System.out.println("Looking for user : "+ userId);
    return userRepository.findById(userId).get();
}

Когда я выполняю первый метод List<User>, я получаю:

  • 1-й раз:выбрать все поля из базы данных
  • 2-й раз: выбрать все поля из Cache
  • 3-й раз: выбрать все поля из Cache

Чтохорошо до сих пор.

Когда я выполняю второй метод findOne(String userId), я получаю результат от:

  • 1-й раз: выберите конкретное поле из базы данных
  • 2-й раз: выбрать конкретное поле из кэша
  • 3-й раз: выбрать конкретное поле из кэша

Что снова хорошо.

КогдаЯ выполняю первый метод List<User> Я получаю:

выбрать все поля данных из кэша

Вопрос: Как оба метода (List<User> и findOne(String userId) имели одинаковое имя кэша, но они возвращали другой результат.

1 Ответ

0 голосов
/ 24 октября 2018

Когда вы аннотируете свой метод аннотацией @Cacheable, Spring применяет к нему поведение кэширования.Имя кэша используется для группировки данных кэша в той же области кэша.Но для хранения значений в области кэша Spring сгенерирует ключ кэша.

По умолчанию SimpleKeyGenerator используется для генерации значения ключа в кеше.SimpleKeyGenerator использует параметры метода для генерации ключа кэша.Значение ключа будет заключено в объект SimpleKey .

Итак, в вашем случае он будет делать следующее:

1-й вызов - нет данных в кеше

  • List<User> findAll()

    1. без параметров
    2. ключ = SimpleKey.EMPTY
    3. результат сохранения метода в кеше с использованием ключа
  • User findOne(String userId)

    1. userId параметр
    2. ключ = new SimpleKey(userId)
    3. результат сохранения метода в кеше с использованием ключа

Как показано выше, хотя имя вашего кэша в @Cacheable одинаково в обоих случаях, ключи, используемые для хранения результатов метода, различны.При повторном вызове ваши методы:

2-й вызов - данные в кеше

  • List<User> findAll()

    1. нетпараметры
    2. ключ = SimpleKey.EMPTY
    3. получить результат из кэша с помощью ключа
  • User findOne(String userId)

    1. userId параметр
    2. ключ = new SimpleKey(userId)
    3. получить результат из кэша с помощью ключа
...