java - Spring @Cacheable 分页方法

标签 java spring caching

我在使用多参数和分页的 @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/

相关文章:

java - this.getHibernateTemplate().delete(bp) 不会立即删除

java - 使用struts2 mvc架构如何将Canvas图像存储到服务器

spring - 将 HATEOAS 添加到具有预先存在的 Spring 依赖项的 Maven 项目

spring - redirect_uri 使用 http 而不是 https

django - 在表中更新时使缓存无效

google-chrome - Chrome 内存缓存与磁盘缓存

java - 如何将字符串附加到整数数组?

java - Maven 找不到我的自定义 Maven 原型(prototype)

java - 如何更改 Spring Cloud Stream 配置中所有 RabbitMQ 消费者的默认恢复间隔?

javascript - 这是在 Angular 上破坏模板缓存的好方法吗?