首页 文章

带分页的Spring @Cacheable方法

提问于
浏览
1

使用多参数和分页时,我遇到了@Cacheable的问题 .

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

    ...

    return result;

}

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

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

谢谢 .

1 回答

  • 5

    我认为您的问题是缺乏对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在那里,但根据我有的信息,这三个应该唯一地标识结果页面 .

相关问题