当前位置: 首页 > 知识库问答 >
问题:

我如何在Spring收集@CacheSet?

杜俊晤
2023-03-14

对于缓存,我使用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;
}

我当然想缓存这个方法。它可以工作,但是@CachePlay只影响findPostById并且不影响findAllPosts,即使我将findAllPosts添加到cacheNames。当我更新Post时,它对单个post(按id)可见,而对getAllPosts不可见(此方法不更新缓存)。我能做些什么来不仅更新单个实体,而且更新整个集合?是否有类似@Collection Cache的东西?

共有1个答案

夹谷宜民
2023-03-14

解决这个问题的一个办法是,每当单个元素被更新时,就清除列表的缓存。

您必须自动连接cacheManager,从那里访问缓存,并在update方法中手动清除您不需要的内容。

示例代码

@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”替换为您的值。

 类似资料:
  • 在阅读了以下文档之后,我设法将基本的graphql.timer.query.*指标发送到Datadog https://www.baeldung.com/spring-boot-actuators https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/#metrics https://github.com/graphql-j

  • 我配置了一个基于Web服务的入站消息传递网关。我想记录传入的SOAP消息(信封和里面的所有消息)。最好的方法是什么? 我曾尝试使用带有日志通道适配器的有线抽头,但不知道一个好的表达式值来获取实际的SOAP XML。如果入站网关配置为不提取有效负载,则我将SaajSoapMessage视为有效负载,否则将DOMSource视为有效负载。是否有一个表达式将SaajSoapMessage作为XML字符串

  • 我有一个来自URL的分页响应,我想继续点击我从上一个响应中获得的下一页URL,并继续收集项目,直到我的响应中没有“nextPage”URL。如何使用WebFlux的Spring引导WebClient在没有阻塞的情况下以反应式方式实现这一点? 在这里,我创建了模拟网址https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/it

  • 我想扩展spring集成消息。我想在消息流经通道期间添加一些头值。 我阅读了MessageHeader的文档,如下所示。我怎样才能得到第三个案例的样本? 创建消息头的一种方法是使用MessageBuilder: MessageBuilder。withPayload(“foo”)。setHeader(“键1”,“值1”)。setHeader(“键2”,“值2”); 第二种选择是创建 组织。sprin

  • 假设我的配置单元表包含以下值: 我正在使用。我在collect_list/collect_set或group_concat查询后出现此错误。 错误:org。阿帕奇。蜂箱服务cli。HiveSQLException:处理语句时出错:失败:执行错误,从组织返回代码2。阿帕奇。hadoop。蜂箱ql.exec。org的MapRedTask先生。阿帕奇。蜂箱服务cli。活动活动toSQLException

  • 我想向Web服务并行发送多个请求。结果应该由成功错误收集,然后可以由调用者进一步分析。 问题:我怎样才能收集所有响应,同时也收集在方法中抛出的异常? 我的目标不是返回两个列表:一个包含所有成功的响应,另一个包含错误。