Java 100M+ 键的缓存设计?

Java caching design for 100M+ keys?

需要为 Java 独立应用程序缓存超过 100+ 百万个字符串密钥(~100 个字符长度)。

标准缓存属性要求:

最好不要使用企业数据库,因为这个 100M 的密钥可以扩展到 500M,这会占用大量内存和系统资源,吞吐量低下。

尝试Guava Cache。它满足您的所有要求。

链接:

编辑:另一个。我还没有使用它。 eh-cache

对于分布式缓存你可以尝试使用hazelcast

它可以根据您的需要进行扩展,并且具有开箱即用的备份和同步功能。它是一个 JSR-107 提供者,并且有许多其他有用的工具可供使用。但是,如果你想要持久化,就需要自己处理或者购买他们的企业版了。

最后,为了解决这个大数据问题,使用现有的缓存解决方案(hazelcast, Guava cache, eh-cache 等):

  • 已将缓存分为两级。
  • 将约 100K 个密钥分组到一个 java 集合中,并将它们与常见的 属性 相关联,在我的例子中,密钥具有时间戳。所以,那个时间戳槽成为这个100K
  • 二级缓存块的关键
  • 此时隙密钥存储在 Java 持久缓存中,其值为压缩 Java 集合。
  • 我设法通过带有压缩和解压缩开销的 2 级缓存获得良好吞吐量的原因是,我的关键搜索是范围限制的,因此当找到缓存匹配时,大多数后续搜索都在内存中解决 java 以前搜索的合集。

总结:确定要分组的键中的公共属性并将它们分解为多级缓存,否则您将需要大量的硬件和企业缓存来支持这个大数据问题。