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