Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的内存缓存对象_Java_Caching_In Memory_Weakhashmap - Fatal编程技术网

java中的内存缓存对象

java中的内存缓存对象,java,caching,in-memory,weakhashmap,Java,Caching,In Memory,Weakhashmap,我想在内存中缓存对象。要求如下: 每个记录/对象都与一个唯一的键相关联 要存储的400-500条记录/对象。如果记录的数量增加超过指定的限制,则应逐出较旧的记录 记录存储时间不应超过2分钟 当JVM内存不足(弱引用)时,应该缩小规模 不能使用第三方库,因为它是一个小模块,目的只是减少不必要的网络访问 写的越多,读的越少 安全性也是一个问题,因为我们将缓存一些敏感数据。这些数据将被缓存在内存中。我真的应该担心安全并加密数据吗 我正在寻找一个提供类似功能的Java类 目前,我正在考虑扩展WeakHa

我想在内存中缓存对象。要求如下:

  • 每个记录/对象都与一个唯一的键相关联
  • 要存储的400-500条记录/对象。如果记录的数量增加超过指定的限制,则应逐出较旧的记录
  • 记录存储时间不应超过2分钟
  • 当JVM内存不足(弱引用)时,应该缩小规模
  • 不能使用第三方库,因为它是一个小模块,目的只是减少不必要的网络访问
  • 写的越多,读的越少
  • 安全性也是一个问题,因为我们将缓存一些敏感数据。这些数据将被缓存在内存中。我真的应该担心安全并加密数据吗

    我正在寻找一个提供类似功能的Java类

    目前,我正在考虑扩展
    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特别指出“第三方库不能使用”