Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite
Posted
技术标签:
【中文标题】Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite【英文标题】:Infinispan equivalent to ehcache's copyOnRead and copyOnWrite 【发布时间】:2011-11-01 07:28:03 【问题描述】:我计划在现有的 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));
【问题讨论】:
【参考方案1】:我相信storeAsBinary
只有在对象需要被序列化时才生效,这意味着当调用put
操作时,所有者不是当前节点。
这也意味着如果 key 0
的所有者不是当前节点,则问题中的测试用例可以通过,但如果它是单节点环境,它仍然会失败。
【讨论】:
【参考方案2】:Infinispan 是否支持 copyOnRead/copyOnWrite,尽管实际格式不可插入。配置元素在 Infinispan 4.x 中为 lazyDeserialization,在 Infinispan 5.x 中为 storeAsBinary。对象使用可插入的 Marshaller 框架进行序列化,该框架用于所有形式的编组,包括网络上的 RPC 调用和存储到磁盘。
【讨论】:
【参考方案3】:据一位 JBoss 开发人员称,Infinispan 尚不支持此类功能。您应该在Infinispan issue tracker 中记录改进请求,以便其他人可以投票(我会)。
话虽如此,如果您现在需要此功能,解决方法是扩展AbstractDelegatingCache,并覆盖get
和put
方法以添加此功能。您可以使用自己的复制策略,或者看看 EHCache 是如何做到的。
此外,如果您还有其他问题,可以考虑Infinispan forum,因为您将获得来自 Infinispan 社区的更多意见。
【讨论】:
谢谢。我相信正确复制对象图是一个难题(在一般情况下),这就是我不想自己做的原因。我会看看 ehcache 是如何做到的,就像你建议的那样,但我想我最终会在修改之前手动复制我从缓存中取出的内容。 我认为EHCache复制对象的默认策略是使用Java的序列化机制......(序列化对象,然后反序列化它:你得到一个新实例)。当然,它很慢,并且仅在对象可序列化时才有效(但缓存对象通常是这种情况,因为您经常想将它们写在磁盘上......)。不过你说得对,复制对象图是个难题,我以前用过Dozer,你也可以看看:***.com/questions/1432764/… 找到它:svn.terracotta.org/svn/ehcache/trunk/core/src/main/java/net/sf/… 太棒了,在我看来,这几乎剥夺了 ehcache 的优势之一。 此信息已过时,支持很久了。以上是关于Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite的主要内容,如果未能解决你的问题,请参考以下文章
spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)