4

我计划在现有的 Web 应用程序中实施缓存解决方案。没什么复杂的:基本上是一个支持溢出到磁盘和自动驱逐的并发映射。将来可能需要对缓存进行集群,但现在不是。

我喜欢 ehcache 的 copyOnRead 和 copyOnWrite 功能,因为这意味着我不必在修改从缓存中取出的内容之前手动克隆内容。现在我已经开始研究Infinispan了,但我还没有找到任何类似的东西。它存在吗?

即,以下单元测试应该通过:

@Test
public void testCopyOnWrite() {
    Date date = new Date(0);
    cache.put(0, date);
    date.setTime(1000);
    date = cache.get(0);
    assertEquals(0, date.getTime());
}

@Test
public void testCopyOnRead() {
    Date date = new Date(0);
    cache.put(0, date);
    assertNotSame(cache.get(0), cache.get(0));
}
4

3 回答 3

7

Infinispan确实支持 copyOnRead/copyOnWrite,尽管实际格式不可插入。配置元素是Infinispan 4.x中的lazyDeserialization和 Infinispan 5.x 中的storeAsBinary 。对象使用可插入的 Marshaller 框架进行序列化,该框架用于所有形式的编组,包括网络上的 RPC 调用和存储到磁盘。

于 2011-06-02T09:46:09.997 回答
2

据一位 JBoss 开发人员称,Infinispan 尚不支持此类功能。您应该在Infinispan 问题跟踪器中记录增强请求,以便其他人可以对其进行投票(我会)。

话虽如此,如果您现在需要此功能,解决方法是扩展AbstractDelegatingCache,并覆盖getput方法以添加此功能。您可以使用自己的复制策略或查看 EHCache 如何获得灵感。

此外,如果您还有其他问题,可以考虑Infinispan 论坛,因为您将从 Infinispan 社区获得更多意见。

于 2010-05-25T15:08:34.723 回答
0

我相信storeAsBinary只有在需要序列化对象时才会生效,这意味着当put调用操作时,所有者不是当前节点。

这也意味着如果密钥的所有者0不是当前节点,问题中的测试用例可以通过,但如果它是单节点环境,它仍然会失败。

于 2013-11-11T17:31:29.153 回答