我要解决的问题是:我有一个带有两个整数字段的对象,我想将其缓存。
public class MyObject {
int x;
int y;
....
}
现在我主要根据字段
x
进行匹配,但是可能存在重复情况,这种情况下我希望回退到第二个字段(使得this.x = that.x且this.y = that.y)。y只能有25个不同的值。现在我知道我可以将两者组合成一个字符串并将其用作缓存键,但是那样我就必须尝试x + [25个可能的值]
才能确定它不在缓存中,从而使缓存未命中变得非常昂贵。我考虑尝试将List<Integer>
作为字段x
的缓存值存储,然后如果有多个,则迭代列表并查找y
的匹配项。现在,如果我使用
ConcurrentList
(或Set,如果我关心重复项-暂时忽略),多个线程是否能够添加到它中,并在没有竞争条件的情况下将其放回缓存?Ehcache是否可能向两个线程返回两个不同的List对象,然后当它们将新值添加到列表并尝试将其放回缓存时,我可能会得到不确定的结果?您是否看到构建此缓存的更好方法?编辑:感谢下面的答案,但是每个人似乎都错过了主要观点。这个方法行得通吗?Ehcache是否可能为相同的缓存键返回两个不同的对象(例如,在调用期间对象在磁盘上并且它被序列化了两次,每次调用一次)。