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