【问题标题】:Java caching design for 100M+ keys?100M+键的Java缓存设计?
【发布时间】:2018-01-03 00:53:45
【问题描述】:

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

标准缓存属性必备:

  • 持续。
  • TPS 可在 10 毫秒范围内从缓存中获取密钥。
  • 允许失效和过期。
  • 独立的缓存服务器,允许多线程访问。

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

【问题讨论】:

  • 解决方案将取决于当前的架构和技术堆栈。您能否详细说明一下技术栈,例如您的应用服务器、请求流等?
  • @arpit - 它是独立的 Java 应用程序,作为 POC,稍后我们将根据可行性研究将插件插入我们的堆栈。

标签: java caching persistence large-data


【解决方案1】:

最后,利用现有的缓存解决方案(hazelcastGuava cacheeh-cache 等)解决这个大数据问题:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      链接:

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

      【讨论】:

      • @Hadi 谢谢。添加!回答。
      • 试过Ehcache、JCS和Redis:都需要1GB以上的存储空间/8-10M的记录。随着尺寸的增大,它们的性能会下降。
      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 2011-01-31
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2015-11-27
      • 2012-10-20
      相关资源
      最近更新 更多