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

在spring中使用@cacheable和@cacheevict

司寇凯
2023-03-14

我开发了一个使用@cacheable注释方法。代码为:

   @Cacheable(value="reporties" , key="{#root.methodName,#manager.name}")
   public List<Employee> getReportiesForManager(Employee manager){
     // code to fetch reporties its a Spring JDBC call
   }

现在,我想在一些事件之后驱逐这个缓存:

  • 一些与manager相关的报表已更新(添加或删除)。

之后,应该驱逐与管理器相关的缓存,这样,应用程序将获得新的数据,而不是使用该缓存中的现有数据。我为此开发了以下方法:

@CacheEvict(value="reporties",key="{#name}")
public void evictReportiesCache(String name){}

我调用inside方法,该方法更新Manager与其报表的关系。然而,这一个工作断断续续,我不确定这是不是正确的方式驱逐缓存。此外,缓存使用#root.methodName作为key的一部分。

有人能帮我搬走缓存吗?

共有2个答案

夹谷星剑
2023-03-14

如果cacheablecacheevict批注标识相同的数据,则传递给它们的键必须相同。

如果您希望通过管理器的名称来逐出报表缓存,则需要同时根据管理器的名称进行缓存和逐出。

劳豪
2023-03-14

您可以将缓存视为映射

每次调用带有@cacheable注释的方法时,都要在映射中写入一个与定义为它们键的内容相关联的值。

每次调用带有@cacheevict注释的方法时,都要删除与键关联的值。您还可以删除映射中的所有条目。

 类似资料:
  • 它可能非常简单,但我想知道我是否可以在一个方法上调用@cacheable和@cacheevict,如下所示: 上面的代码是在每次调用方法时逐出empListCache,还是只在缓存已满时逐出? 多谢了。

  • 我正在尝试替换旧的: 由此: 因为我想使用高级缓存功能,比如不缓存空值等等。 为此,我遵循了Spring教程https://spring.io/guides/gs/caching/ 如果我没有为我的应用程序添加注释。在java中,缓存根本不起作用。 但是如果我添加EnableCaching和CacheManager bean: 我在启动时收到以下错误: Java语言lang.IllegalStat

  • 我有一个服务与下一个方法: 我从控制器中调用getTestWithId100方法,但它只获得新值。 部分ehcache.xml: 为什么它不工作?我尝试了不同的键,但没有成功。

  • 我正在从下面的方法中获取电影列表,并带有@Cacheable注释。由于它没有任何参数,我将key设置为#root.method.name。 现在,我想添加一个新的电影,同样应该添加到上述缓存。 我试过这个,但它给了我例外。 我们可以在这里使用@CachePut注释,还是有其他方法?

  • 我有一个用并尝试使用注释。该方法还用注释。将忽略注释。是否可以在Mapstruct方法上使用?

  • 问题内容: 我在源代码下找到了以下文档 CachePut批注不会导致目标方法被跳过-而是总是导致该方法被调用并将其结果放入缓存中。 这是否意味着如果使用,updateCustomer方法将仅执行一次,结果将在缓存中更新。随后对updateCustomer的调用将不会执行updateCustomer,而只会更新缓存。 在的情况下,方法将在每次调用时执行,结果将在缓存中更新。 我的理解正确吗? 问题答