使用@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 执行了以下操作:
- 保存了两个博客。两个博客都被保存到数据库中。
- 调用了获取所有博客。返回两个已保存的博客。
- 保存了一个新博客。在这里,我假设缓存已被驱逐。
- 我调用了 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
我正在尝试在 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 执行了以下操作:
- 保存了两个博客。两个博客都被保存到数据库中。
- 调用了获取所有博客。返回两个已保存的博客。
- 保存了一个新博客。在这里,我假设缓存已被驱逐。
- 我调用了 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