@Cacheable无参数方法存在缓存逐出问题



我正在尝试在Spring Boot RESTful服务中实现Spring缓存。这是getAllBlogs((和getBlogById((方法的缓存代码。

@Cacheable(value="allblogcache")
@Override
public List<Blog> getAllBlogs() {
System.out.println("******* "+ blogRepository.findAll().toString());
return (List<Blog>) blogRepository.findAll();
}
@Cacheable(value="blogcache", key = "#blogId")
@Override
public Blog getBlogById(int blogId) {
Blog retrievedBlog = null;
retrievedBlog = blogRepository.findById(blogId).get();
return retrievedBlog;
}

在saveBlog方法中,我想收回缓存,并使用了以下代码。

@Caching(evict = {
@CacheEvict(value="allblogcache"),
@CacheEvict(value="blogcache", key = "#blog.blogId")
})
@Override
public Blog saveBlog(Blog blog) {
return blogRepository.save(blog);
}

在跑步时,我使用Postman完成了以下操作:

  1. 保存了两个博客。两个博客都被保存到数据库中
  2. 名为"获取所有博客"。将返回两个保存的博客
  3. 保存了一个新博客。在这里,我假设缓存已被逐出
  4. 我打电话给getAll博客。然而,只有两个博客被退回。这意味着博客是从旧缓存中返回的。它没有被驱逐调用第三次保存

github回购位于https://github.com/ximanta/spring-cache

如果在不指定键的情况下驱逐缓存,则需要添加allEntries = true属性(请参阅文档(。

在您的情况下,它将是@CacheEvict(value="allblogcache", allEntries = true)

p.S.对其进行了测试,并设法使其发挥作用。公关:https://github.com/ximanta/spring-cache/pull/1

它抛出异常,因为您使用了错误的密钥表达式:

@Caching(evict = {
@CacheEvict(value="allblogcache"),
@CacheEvict(value="blogcache", key = "#blogId")
~~~~~~~~~~ => Refer to parameter blogId but not found
})
public Blog saveBlog(Blog blog)

正确的表达式是:

@Caching(evict = {
@CacheEvict(value="allblogcache"),
@CacheEvict(value="blogcache", key = "#blog.id") // Assume that the property for blog ID is "id"
})
public Blog saveBlog(Blog blog)

相关内容

  • 没有找到相关文章

最新更新