Java 如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?
我在项目中使用Java 如何在使用com.jcabi.aspects的@Cacheable注释时从缓存中刷新特定数据?,java,caching,jcabi,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) { //
@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:。我相信你的设计应该得到改进,以使之成为可能。目前,您的班级员工实际上不是一个团队,而是一组过程(a)。这就是缓存不能正确执行的原因。相反,您需要一个新的类/装饰器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的好处了吗?:) 谢谢你的回复@yegor256。但还有一件事我想知道——如果我有两个对象,比如e1和e2,它们正在调用一个可缓存的方法,那么是否有可能只为e1调用该方法,而e2对象得到缓存结果?@ANKITMITTAL好吧,这就是它的工作原理:可缓存的方法只执行一次,对它的所有其他调用将返回以前缓存的值。或者我不理解这个问题?假设有两个对象e1和e2,它们都调用了可缓存方法add,那么该方法被调用两次,每个对象调用一次。有没有办法对多个对象也只调用一次?@ANKITMITTAL我认为您必须创建第三个对象,它将封装e1和e2。如果我没弄错你的问题。