我在使用多参数和分页时遇到了@Cacheable问题。
@Cacheable(value = "books", key = "#p0")
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
问题是当我第一次调用该方法时,内容缓存成功,结果就像我期望的那样。但是当我第二次打电话时,返回的结果等于第一次。如果我禁用缓存或删除密钥,结果会有所不同。
密钥的使用是强制性的,因为有时会删除指定用户的缓存。
感谢。
答案 0 :(得分:6)
我认为您的问题是缺乏对Cacheable注释的理解,而您正在使用它。那么让我看看我是否可以提供帮助
你的注释是@Cacheable(值=&#34;书籍&#34;,键=&#34;#p0&#34;)
这意味着当调用此方法时,它将获取第一个参数并在缓存中查找它,如果有结果,则返回它而不是执行该方法。它只是检查第一个参数。
您的缓存密钥必须是唯一标识结果集的内容。在这种情况下,用户ID在多个结果中是通用的,并且不能唯一地标识页面。
你知道你的用例比我更好,但是这样的事情可能会更好:
@Cacheable(value = "books", key = {"#p1","#p2","#p3"})
public List<Book> findBooks(Long loggedUserId, String q, Integer firstResult, Integer maxResults) {
...
return result;
}
以上内容将根据搜索查询和页面索引(结果的开始和结束)进行缓存。由于我不知道您的用例我不知道为什么用户ID在那里,但根据我拥有的信息,这三个应该唯一地标识结果页面。