Spring @Cacheable метод с нумерацией страниц

1

У меня возникают проблемы с @Cacheable, используя несколько параметров и разбиение на страницы.

@Cacheable(value = "books", key = "#p0")
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {

    ...

    return result;

}

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

Использование ключа является обязательным, поскольку иногда кеш указанного пользователя удаляется.

Благодарю.

Теги:
spring
caching

1 ответ

4
Лучший ответ

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

Ваша аннотация @Cacheable (value = "books", key = "# p0")

Это означает, что когда этот метод вызывается, он будет принимать первый параметр и искать его в кеше, а если есть результат, он будет возвращен вместо выполнения метода. ТОЛЬКО ПРОВЕРЯЕТ ПЕРВЫЙ ПАРАМЕТР.

Кэш-ключ должен быть тем, что однозначно идентифицирует набор результатов. В этом случае идентификатор пользователя является общим для нескольких результатов и не однозначно идентифицирует страницу.

Вы знаете, что ваш прецедент лучше, чем я, но что-то вроде этого, вероятно, будет лучше:

@Cacheable(value = "books", key = {"#p1","#p2","#p3"})
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {

...

return result;

}

Вышеуказанное будет кэшировать на основе поискового запроса и индекса страницы (начало и конец результатов). Поскольку я не знаю вашего случая использования, я не знаю, почему здесь находится идентификатор пользователя, но из информации, которую у меня есть, эти три должны однозначно идентифицировать страницу результатов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню