【问题标题】:Using @Cacheable and @CacheEvict in Spring在 Spring 中使用 @Cacheable 和 @CacheEvict
【发布时间】:2018-02-02 01:29:40
【问题描述】:

我开发了一种使用@Cacheable 注释的方法。代码是:

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

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

  • 一些与经理相关的报告已更新(添加或删除)。

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

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

我在方法内部调用了更新经理及其报告人的关系。但是,这一个间歇性地工作,我不确定这是否是驱逐缓存的正确方法。 Cacheable 还使用#root.methodName 作为键的一部分。

有人可以帮我解决这个缓存驱逐问题吗?

【问题讨论】:

    标签: java spring caching


    【解决方案1】:

    您可以将缓存视为Map&lt;key, value&gt;。

    每次您使用 @Cacheable 注释调用方法时,您都会在 Map 中写入一个与您定义为键的值相关联的值。

    每次调用带有@CacheEvict 注释的方法时,都会删除与键关联的值。您也可以删除地图中的所有条目。

    【讨论】:

    • 如另一个答案中所述,您驱逐的密钥的值必须与您缓存的密钥相同。
    【解决方案2】:

    传递给Cacheable 和CacheEvict 注释的键必须相同,如果它们标识相同的数据。

    如果你想通过经理的名字驱逐你的reports缓存,你需要cache和evict仅仅基于经理的名字.

    【讨论】:

    • 我无法更改可缓存的键,因为它不在我的控制范围内。该键将同时具有#root.methodName 和#manager.name。如何在cache evict中指定methoname来匹配cacheable的key
    • 好的。会尝试硬编码。谢谢,但是这个注释也有很多方法,我需要为每个可缓存的方法写 evict 吗?
    • 您可以使用@CacheEvict( value = "reporties", allEntries = true ) 一种方法从reporties 缓存中逐出所有项目。
    • 恐怕您必须指定密钥才能识别特定的经理。
    • 我将传递那个管理器键,但是方法名称呢。我硬编码了方法名,但它不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2015-11-26
    • 2019-12-02
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多