使用@Cacheable 无参数方法缓存驱逐问题

Cache Evict issue with @Cacheable parameterless method

我正在尝试在 Spring 引导 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. 我调用了 get All blogs。但是,只有两个博客被返回。这个 表示博客是从旧缓存返回的。它没有被驱逐 调用第三次存档。

github 存储库位于 https://github.com/ximanta/spring-cache

它抛出异常,因为你使用了错误的键表达式:

@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)

如果您在未指定密钥的情况下逐出缓存,则需要添加 allEntries = true 属性(请参阅 docs)。

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

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