java中的内存缓存对象
我想在内存中缓存对象。要求如下:java中的内存缓存对象,java,caching,in-memory,weakhashmap,Java,Caching,In Memory,Weakhashmap,我想在内存中缓存对象。要求如下: 每个记录/对象都与一个唯一的键相关联 要存储的400-500条记录/对象。如果记录的数量增加超过指定的限制,则应逐出较旧的记录 记录存储时间不应超过2分钟 当JVM内存不足(弱引用)时,应该缩小规模 不能使用第三方库,因为它是一个小模块,目的只是减少不必要的网络访问 写的越多,读的越少 安全性也是一个问题,因为我们将缓存一些敏感数据。这些数据将被缓存在内存中。我真的应该担心安全并加密数据吗 我正在寻找一个提供类似功能的Java类 目前,我正在考虑扩展WeakHa
WeakHashMap
,并实现各种私有/公共方法以满足需求
如果您有任何其他想法,请在这里分享。不,您不应该这样做 现在很容易理解为什么WeakHashMap不能用于缓存。首先,它无论如何都不会工作,因为它对键使用软引用,而不对贴图值使用软引用。但除此之外,垃圾收集器会主动回收仅由弱引用引用的内存。这意味着,一旦丢失了对在WeakHashMap中用作键的对象的最后一个强引用,垃圾收集器将很快回收该映射项 那么我该如何在Java中实现缓存呢? 我的建议是使用一种免费提供的缓存实现,比如,和。这些库使用LRU和FIFO策略(例如,磁盘溢出、数据过期和许多其他可选高级功能)提供更好的内存管理
正如@user463324所提到的,您应该只使用一个已经实现了这一点的库,比如,它在许可证下,任何理智的企业都不会有问题。不是忽略解决方案的好理由。您有两个选择:JCS或Memcache/EHCache 这两个选项在功能上是等效的,但有一些关键的区别。使用JCS时,缓存的对象不会序列化/反序列化。它们仍然是java对象,因此存储和检索它们非常快。但是,这意味着您的缓存位于JVM内,因此使用JVM的堆,其他JVM也无法访问。[JCS作为一个插件提供了某种类型的分布式功能]
另一方面,Memcache/Ehcache是在执行put/get操作时执行序列化/反序列化的外部缓存。在某些极端情况下,这可能会抵消缓存的好处。因此,速度基准测试至关重要。如果合适,它是分布式的,它使用自己的内存,可以放在另一个盒子上。但这也意味着,你必须考虑JVM和外部缓存之间的数据安全性。 < P>你不想使用<代码> WeakHashMap < /代码>。code>SoftHashMap将更接近,但在标准库中不可用。如果我是你,我会找线索的 但这里有一些额外的想法: 当JVM内存不足(弱引用)时,应该缩小规模 你是说
软参考
。但不管怎样,这个要求对我来说有点异味。我承认这是一个有效的要求,但很少有人真的需要这个。如果可以合理地预测记录的大小,并且计划对要缓存的记录数量进行严格限制,那么很可能不需要这种复杂性
不应使用第三方库
每个人都提到了这一点,他们是对的
在安全方面,对缓存在内存中的数据进行加密的效果令人怀疑。您还必须将加密密钥保存在内存中。我敢打赌,比起攻击者读取您的内存内容,还有很多事情需要担心。
不应该使用第三方库。
这是一个奇怪的要求。@BrendanLong是对的。这将是解决这个问题的一个极好的方法。如果你被要求重新实现这个特定的轮子,并且你问了这些问题,那么一定是出了问题。@Brendan实际上,“没有第三方库”这是我在企业界的项目中遇到的一个非常普遍的要求。许多企业商店不会使用开源解决方案,因为他们认为,如果解决方案的开发人员剽窃了它,这会使他们承担责任。OP特别指出“第三方库不能使用”