如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?

时间:2017-01-24 07:04:09

标签: java caching jcabi

我在我的项目中使用@Cacheable注释com.jcabi.aspects用于缓存机制,我有一个场景,我需要从缓存中清除特定数据,而不是刷新整个缓存。怎么可能?

例如,

import com.jcabi.aspects.Cacheable;
public class Employees {
     @Cacheable(lifetime = 1, unit = TimeUnit.HOURS)
     static int size(Organization org) {
         // calculate their amount in MySQL
     }
     @Cacheable.FlushBefore
     static void add(Employee employee, Organization org) {
         // add a new one to MySQL
     }
}

如果我有一个由两个组织Org1和Org2使用的类Employees,现在如果将新员工添加到Org1,那么只应从缓存中刷新Org1的数据,并且Org2的数据应该保留在缓存中。

com.jcabi.aspects.Cacheable @Cacheable的参考:http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html

1 个答案:

答案 0 :(得分:5)

jcabi-aspects无法实现。而且我相信你的设计应该得到改进,以使其成为可能。目前,您的班级Employees实际上不是proper object,而是一系列程序(utility class)。这就是为什么缓存无法正确完成的原因。相反,您需要一个新的类/装饰器MySqlOrganization

class MySqlOrganization {
  private final Organization;
  @Cacheable
  public int size() {
    // count in MySQL
  }
  @Cacheable.FlushBefore
  public void add(Employee emp) {
    // save it to MySQL
  }
} 

现在看一下正确的OOP的好处? :)