我正在尝试在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完成了以下操作:
- 保存了两个博客。两个博客都被保存到数据库中
- 名为"获取所有博客"。将返回两个保存的博客
- 保存了一个新博客。在这里,我假设缓存已被逐出
- 我打电话给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)