我在使用多参数和分页的 @Cacheable 时遇到问题。
@Cacheable(value = "books", key = "#p0")
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
问题是当我第一次调用该方法时,内容已成功缓存,结果正如我所期望的那样。但是当我第二次调用时,返回的结果等于第一次。如果我禁用缓存或删除 key ,结果会有所不同。
必须使用 key ,因为有时指定用户的缓存会被删除。
谢谢。
最佳答案
我认为你的问题是缺乏对 Cacheable 注释的理解,而你正在使用它。那么让我看看是否可以提供帮助
您的注释是@Cacheable(value = "books", key = "#p0")
这意味着当调用该方法时,它将获取第一个参数并在缓存中查找,如果有结果,则将返回结果而不是执行该方法。它仅检查第一个参数。
您的缓存键必须是唯一标识结果集的内容。在这种情况下,用户 ID 在多个结果中是通用的,并且不能唯一标识页面。
你比我更了解你的用例,但这样的东西可能会更好:
@Cacheable(value = "books", key = {"#p1","#p2","#p3"})
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
以上内容将根据搜索查询和页面索引(结果的开始和结束)进行缓存。因为我不知道你的用例,所以我不知道为什么用户 ID 在那里,但根据我所掌握的信息,这三个应该唯一标识一个结果页面。
关于java - Spring @Cacheable 分页方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415658/