【问题标题】:In-memory caching objects in javajava中的内存缓存对象
【发布时间】:2012-09-18 17:34:31
【问题描述】:

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

  1. 每条记录/对象都与一个唯一键相关联。
  2. 要存储 400-500 条记录/对象。如果记录数增加超过指定限制,则应逐出较旧的记录。
  3. 记录的存储时间不应超过 2 分钟。
  4. 当 JVM 内存不足时应该缩减(弱引用的一种)。
  5. 无法使用第三方库,因为它是一个小模块,目的只是为了减少不必要的网络访问。
  6. 写入更多,读取更少

这里的安全性也是一个问题,因为我们要缓存一些敏感数据。这些数据将被缓存在内存中。我真的应该担心安全性并加密数据吗?

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

目前我正在考虑扩展WeakHashMap,并实现各种私有/公共方法以符合要求。

如果您有任何其他想法,请在此处分享。

【问题讨论】:

  • Third party library shouldn't be use. 这是一个奇怪的要求..
  • @BrendanLong 是对的。 Guava's CacheBuilder 将是解决此问题的绝佳方法。
  • 如果您的任务是重新实现这个特定的轮子,并且您正在问这些问题,那么就出了问题。
  • @Brendan 实际上,“没有第三方库”是我在企业世界的项目中遇到的一个非常普遍的要求。
  • 许多企业商店不会使用开源解决方案,因为他们认为如果解决方案的开发人员剽窃,他们将承担责任。

标签: java caching in-memory weakhashmap


【解决方案1】:

您不想使用WeakHashMapSoftHashMap 会更接近,但在标准库中不可用。如果我是你,我会查看Guava's cache classes 以获取提示。

但这里有一些额外的想法:

当 JVM 内存不足时应该缩减规模(一种弱引用)。

你的意思是soft reference。但无论如何,这个要求对我来说有点味道。我承认这可能是一个有效的要求,但你很少真正需要这个。如果您的记录大小可以很好地预测,并且您计划对要缓存的记录数量进行硬性限制,那么您可能不需要这种复杂性。

不应使用第三方库。

每个人都提到了这一点,他们是对的。

在安全方面,加密缓存在内存中的数据的效果值得怀疑。您还必须将加密密钥保存在内存中。我敢打赌,除了攻击者读取您的内存内容之外,还有很多事情需要担心。

【讨论】:

    【解决方案2】:

    不,你不应该这样做。 WeakHashMap is not a cache!

    现在很容易理解为什么 WeakHashMap 不能用于缓存。首先它无论如何都不起作用,因为它对键使用软引用而不是映射值。但除此之外,垃圾收集器会积极回收仅由弱引用引用的内存。这意味着一旦您丢失了对作为 WeakHashMap 中的键工作的对象的最后一个强引用,垃圾收集器将很快回收该映射条目。

    ...

    那么我到底该如何在 Java 中实现缓存呢?

    我的建议是使用免费提供的缓存实现之一,例如JCSOSCacheothers。这些库通过 LRU 和 FIFO 策略提供更好的内存管理,例如磁盘溢出、数据过期和许多其他可选的高级功能。

    正如@user463324 所提到的,您应该只使用一个已经实现此功能的库,例如Google Guava,它在Apache 2.0 许可下,任何理智的企业都不会遇到问题。 Not invented here 不是忽略解决方案的好理由。

    【讨论】:

      【解决方案3】:

      您有两个选择:JCS 或 Memcache/EHCache

      这两个选项在功能上是等效的,但有一些关键的区别。当您使用 JCS 时,缓存的对象不会被序列化/反序列化。它们保留为 java 对象,因此存储和检索它们非常快。但是,这意味着您的缓存位于 JVM 内部,因此使用 JVM 的堆,并且其他 JVM 也无法访问。 [JCS 提供某种类型的分布式功能作为插件]。

      另一方面,Memcache/Ehcache 是在执行 put/get 操作时执行序列化/反序列化的外部缓存。在某些极端情况下,这可能会抵消缓存的好处。因此,速度基准测试是必不可少的。如果合适,它是分布式的,它使用自己的内存,可以在另一个盒子上。但这也意味着,您必须考虑 JVM 和外部缓存之间的数据安全性。

      【讨论】:

      • OP特别说“第三方库不能用”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2012-10-06
      相关资源
      最近更新 更多