带分页的Spring @Cacheable方法

时间:2014-03-14 21:01:09

标签: java spring caching

我在使用多参数和分页时遇到了@Cacheable问题。

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

    ...

    return result;

}

问题是当我第一次调用该方法时,内容缓存成功,结果就像我期望的那样。但是当我第二次打电话时,返回的结果等于第一次。如果我禁用缓存或删除密钥,结果会有所不同。

密钥的使用是强制性的,因为有时会删除指定用户的缓存。

感谢。

1 个答案:

答案 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在那里,但根据我拥有的信息,这三个应该唯一地标识结果页面。