2017-10-17 130 views
2

我试图实现具有预取功能的缓存。缓存不可序列化的对象

该计划是,如果缓存条目是新的,那么它将按原样返回。 如果缓存的年龄超过设定的年龄,则会在新的线程被刷新以刷新条目时返回“旧”缓存。 如果它比它更老,它将更新条目并返回它。

这样做的计划是为了避免在用户需要等待缓存刷新时发生缓存未命中。

我有一种使用hashmap作为缓存存储的工作模式,但这看起来很脏。

所以我想用这个javax.cache.cache-api包,我选择org.infinispan.infinispan.jcache作为实现。 问题是,我想保存在缓存中的对象是不可序列化的,我不知道如何让inifinispan允许它们。

他们为什么不可序列化的原因是因为他们存储函数以更新缓存条目。

问题是: 你可以使用infinispan存储不可序列化的对象吗?如果是这样,如何?

或者是否有任何开箱即用的解决方案已经完成了我的工作?

+0

不知道这个包,你可能会尝试创建一个实现包含实际对象的'Serializable'的包装器对象。这显然不会工作,如果实际的序列化发生,但应该只发生(至少在我的眼中),如果我们谈论的是由多个实例共享的缓存(如果这是这个包的东西) – Lothar

+0

我以为是一样的,但它似乎仍然有问题。而且我已经有一个包含实际缓存值的包装器,它也存储更新函数。我试图实现'Serializable',但没有运气。 (并且没有,它不被多个实例共享) – munHunger

回答

1

自Infinispan 5.0以来,只要用户可以为这些非Seralizable对象提供有意义的Externalizer实现,就支持封送编组的非序列化键/值对象。这section有更多的细节。

4

Infinispan不要求您的值为Serializable

这只是群集缓存所需要的,但对于您的用例看起来像一个合理的本地缓存可能更适合。

显然,如果您需要缓存来跨服务器和/或数据中心复制数据,那么Infinispan将需要一些方法来通过电线来整理对象。如果您也想使用这些功能,则可以为您的类型插入自定义Externalizer实现。

即使对于可序列化类型,插入自定义外部实现程序实现可能也是一个好主意,因为自定义外部化程序框架通常会比Java标准序列化执行得更好。

+0

'java.io.Externalizable'相当快(比上次检查时'Serializable'大约快10倍) – Lothar

+0

除了速度之外,使用Infinispan自定义外部化器的主要好处处于更紧凑的输出尺寸;这有助于减少内存消耗,减少GC工作,并通过网络传输更快的数据。 – Sanne