我正在缓存以异步方式发送到我的组件的对象。换句话说,这些对象到达的顺序是不可预测的。为了避免任何问题,我在我的对象中包含了一个版本属性(基本上是一个时间戳)。我们的想法是,任何以比已经缓存的版本更旧的版本到达的对象都可以被丢弃。
EHCache的“Element”类(包装EHCache中的对象)似乎有助于此:除了键和值之外,构造函数可以采用(基于长度的)版本。我不能按照我希望它工作的方式来完成这项工作。以下代码段演示了我的问题(使用EHCache 2.1.1):
public static void main(String[] args) {
final CacheManager manager = CacheManager.create();
final Cache testCache = new Cache(new CacheConfiguration("test", 40));
manager.addCache(testCache);
final String key = "key";
final Element elNew = new Element(key, "NEW", 2L);
testCache.put(elNew);
final Element elOld = new Element(key, "OLD", 1L);
testCache.put(elOld);
System.out.println("Cache content:");
for (Object k : testCache.getKeys()) {
System.out.println(testCache.get(k));
}
}
我希望上面的代码能够使缓存的值为“NEW”,而是打印“OLD”。如果你对插入元素的顺序稍微玩一下,你会发现最后一个插入元素的是保留在缓存中的那个。版本控制似乎被忽略了。
我是否未正确使用版本控制功能,或者它是否可能无意用于此目的?任何人都可以推荐替代品吗?
答案 0 :(得分:2)
EhCache显然忽略了version
字段的值 - 其含义由用户定义。因此,EhCache会使用版本2L
覆盖您的版本1L
,而不知道版本号的含义。
参见1)http://jira.terracotta.org/jira/browse/EHC-765
决定提供内部版本控制方案 导致所有用户不必要的开销。相反,我们现在离开了 版本值未触及,因此它完全在控制之内 用户。
并且2)http://jira.terracotta.org/jira/browse/EHC-666
[...]我更倾向于Marek提出的解决方案,即我们授予的解决方案 用户完全控制版本属性,不要改变它 在内部。这可以防止对性能产生任何影响 对于大多数用户而言,并允许用户灵活地使用它 他们认为合适。 [...]
根据Greg通过电子邮件达成的协议,我将此修复为 根据我上次的评论。
我认为使用version
字段可能会导致竞争条件,从而导致一个线程覆盖一个缓存项目的最新版本,其中包含一些旧版本。因此,在我的应用程序中,我有一个计数器,可以跟踪最新版本的数据库,当我加载一个缓存值,其中version
字段与最新数据库版本值不同时,我知道缓存的值可能是陈旧的并且忽略它。