在Spring中使用@Cacheable和@CacheEvict

时间:2017-08-24 08:45:57

标签: java spring caching

我有一个方法,我有一个@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,我在方法中调用了更新Manager及其报告的关系。

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

此代码间歇性地工作,我不确定这是否是驱逐缓存的正确方法。而且Cacheable使用#root.methodName作为密钥的一部分。 有人可以帮我解决这个缓存驱逐问题。

2 个答案:

答案 0 :(得分:2)

您可以将缓存视为Map<key, value>

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

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

答案 1 :(得分:0)

传递给CacheableCacheEvict注释的密钥如果识别相同的数据,则必须相同。

如果您想按管理员的名称逐出报告缓存,则需要同时基于缓存逐出关于经理的名字。