Java 缓存不可序列化的对象

Java 缓存不可序列化的对象,java,caching,serialization,infinispan,Java,Caching,Serialization,Infinispan,我正在尝试实现具有预取功能的缓存 计划是,如果缓存条目是新的,那么它将按原样返回。 如果缓存的时间早于设置的时间,则在生成新线程以刷新条目时,将返回“旧”缓存。 如果它甚至早于此,它将更新条目,然后返回它 这样做的计划是避免在用户需要等待缓存刷新时出现缓存未命中 我已经得到了一个使用hashmap作为缓存存储的工作模型,但这看起来有点脏 因此,我想为此使用javax.cache.cache api包,并选择org.infinispan.infinispan.jcache作为实现。 问题是我想保存

我正在尝试实现具有预取功能的缓存

计划是,如果缓存条目是新的,那么它将按原样返回。 如果缓存的时间早于设置的时间,则在生成新线程以刷新条目时,将返回“旧”缓存。 如果它甚至早于此,它将更新条目,然后返回它

这样做的计划是避免在用户需要等待缓存刷新时出现缓存未命中

我已经得到了一个使用hashmap作为缓存存储的工作模型,但这看起来有点脏

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

它们不可序列化的原因是,它们存储函数以同时更新缓存项

问题是: 你能用infinispan存储像这样的非序列化对象吗?如果可以,怎么存储

或者,是否有现成的解决方案可以满足我的需求

自Infinispan 5.0以来,只要用户能够为这些不可序列化的对象提供有意义的外部化器实现,就支持编组不可序列化的键/值对象。这有更多的细节


Infinispan不要求您的值是可序列化的

这仅适用于集群缓存,但对于您的用例来说,似乎更适合使用合理的仅本地缓存

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


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

在不了解此包的情况下,您可能会尝试创建一个包装器对象,该对象实现了包含实际对象的
Serializable
。如果发生了实际的序列化,这显然不起作用,但只有当我们讨论由多个实例共享的缓存时(如果这是这个包的一个问题),这才应该发生(至少在我看来),我也这么认为,但它似乎仍然有问题。我已经有了一个实际缓存值的包装器,它也存储了update函数。我曾尝试实现
可序列化
,但没有成功。(不,它不是由多个实例共享的)
java.io.Externalizable
相当快(大约比我上次检查的
Serializable
快10倍)除了速度之外,使用Infinispan自定义外部化器的主要好处是输出大小更紧凑;这有助于减少内存消耗,减少GC工作,并在下一个网络上加快数据传输。