如何解决我如何在 Spring 中使用 @CachePut 进行收集?
对于缓存,我使用 Ehcache3
作为提供者。假设我有这个方法:
@Transactional
@Cacheable(cacheNames = "findAllPosts")
public Page<Post> getAllPosts(Pageable pageable) {
return postRepository.findAll(pageable);
}
@Transactional
@Cacheable(cacheNames = "findPostById")
public Post findById(Long id) {
return postRepository.findById(id).orElseThrow(exceptionHelper.getEntityNotFoundException(id,Post.class));
}
@Transactional
@CachePut(cacheNames = "findPostById",key = "#result.id")
public Post update(Long postId,Post postToUpdate) {
Post post = postRepository.getone(postId);
post.setTitle(postToUpdate.getTitle());
post.setContent(postToUpdate.getContent());
post.setUpdated(LocalDateTime.Now());
return post;
}
我当然想缓存这些方法。它有效,但 @CachePut
仅影响 findPostById
,即使我将 findAllPosts
添加到 cacheNames 也不影响 findAllPosts
。当我更新 Post 时,它对单个帖子(按 id)可见,而不是 getAllPosts
(此方法未更新缓存)。我该怎么做才能不仅更新单个实体而且更新整个集合?有没有类似 @CollectionCache
的东西?
解决方法
对此的一种解决方案是在单个元素更新时逐出列表的缓存。
您必须自动装配 cacheManager,从那里访问缓存并在更新方法中手动逐出您需要的内容。
示例代码:
@Autowired
private CacheManager cacheManager;
@Transactional
@CachePut(cacheNames = "findPostById",key = "#result.id")
public Post update(Long postId,Post postToUpdate) {
Cache allPostsCache = cacheManager.getCache("cacheName").evict("cacheKey");
Post post = postRepository.getOne(postId);
post.setTitle(postToUpdate.getTitle());
post.setContent(postToUpdate.getContent());
post.setUpdated(LocalDateTime.now());
return post;
}
当然,您需要用您的值替换“cacheName”和“cacheKey”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。