Spring. Как удалить кэш метода findByUsername при удалении юзера по айди?

Для кэша использую Redis.

В ЮзерСервисе есть метод поиска юзера по имени:

@Cacheable(value = "UserService::getByUsername", key = "#username")
    public User getByUsername(String username) {
        return userRepository.findByUsername(username)
                .orElseThrow(() -> new ResourceNotFoundException("Not found user with username: " + username));
    }

И есть метод удаления юзера по айди:

    public void delete(Long id) {
        userRepository.delete(id);
    }

При удалении юзера, разумеется нужно и очистить кэш метода getByUsername.

Здесь упираюсь в вопрос где мне взять user.username.

Пока вижу два решения:

  • Можно сделать дополнительный запрос к БД по айди и вытащить имя:
@CacheEvict(value = "UserService::getByUsername", key = "userService.findById(#id).name")
    public void delete(Long id) {
        userRepository.delete(id);
    }

Но ведь кэш должен сокращать количество обращений к базе и скорость выполнения, а не увеличивать их.

  • Можно передавать в метод delete не какое-то поле юзера, а его объект целиком. Но возможно у нас есть тз, и нашу апишку буду дергать именно с методом удаления по айди.

Наверняка есть более изящное решение этого вопроса, буду благодарен за помощь!


Ответы (1 шт):

Автор решения: Deniska SosiSka

Как вариант это подход с передачей объекта, в метод посредник(это можно быть полиморфный delete), в котором вы заберёте name и прокините его в метод для удаления. Это не внесёт изменений в документированный api

→ Ссылка