Java 用于维护海量数据的缓存框架

Java Caching frameworks for maintaining huge data

Java 用于存储大量数据的缓存框架。

上下文: 我们正在使用 Jersey 2.6 开发 Restful 服务,并将在 WAS 8.5 上部署它。此服务每天需要处理超过 1000 万个请求。

我们需要实现一个缓存来存储超过 300k 的对象(数据将来自 DB)。我们需要一些方法来每天更新缓存。

  1. 是否推荐这种缓存 300k 对象并每天更新它们的方法?
  2. 有没有Java框架支持这种功能?

是的,例如:Coherence、Hazelcast。都是分布式现金。 http://java.dzone.com/articles/sneak-peek-jcache-api-jsr-107

一般来说,您应该缓存您正在使用的内容,并且缓存应该始终同步而不是每天。您将最近使用的对象放入缓存中,然后通过缓存将 read/write 获取到您的数据库。

如果有钱,最好的是连贯性(大金融公司的口碑证明)

Hazelcast 是您可以使用的另一种分布式缓存内存,它比基于性能指标的一致性低一级。

可以尝试 ehcache。它可以用作查询缓存甚至休眠二级缓存。 您可以配置实体在失效之前应在缓存中存储多长时间。

问题是缓存是否必须分布。记住缓存是你见过的东西。并张贴它以寻找它可能有用的机会......为什么。

分布式缓存系统:内存中的Redis、Cassandra。 MongoDB在记忆中。

本地 RocksDB(让你存储 byte[] -> byte[])和 SSD 构成了一个很好的本地缓存层。您还可以在其之上添加分布式层。通常比货架上的东西更好。应该也很容易实施。

每天 1000 万个请求并不多。在 10 小时内,您可以处理 1Mio / 60 / 60 => 每秒 3000 个请求。根据负担得起,您通常可以选择高效的前端和高效的后端。我们可以每秒处理 40k 页和核心,并拥有 24 个核心……你知道数学。内存中的数据未完成缓存...

您的问题过于笼统,无法得到明确的答案。您需要描述您要解决的问题是什么。

  • 您是否担心响应时间?
  • 您是否正在尝试保护您的数据库免于承担繁重的工作?
  • 是否期望必须横向扩展并希望确保您可以处理未来的负载?

此外,一些更多的上下文信息会很有用,尤其是:

  • 与您的请求相比,您的数据有多动态?
  • 平均每天请求的数据占数据总量的百分比是多少? (30 万个对象中有多少个每天至少查询一次?如果您不知道,请提供您的最佳猜测)。

您给出的数字为 30 万 (300k) 个数据点和 1000 万个请求,这意味着您预计平均每天命中每个对象 33 次,这表明您比响应更关心后端数据库负载是最新的。

根据我的经验,有很多相当原始的解决方案比 Mongo、Cassandra 或 Coherence 等重量级分布式系统要好得多。

我的第一反应是:保持简单 - 30 万个对象存储在内部哈希中并不过分 table,您每天刷新一次并在第一次请求时填充。

如果您需要横向扩展,我建议使用 1 天缓存时间的 Memcache Spymemcached,当您找不到现有条目时填充它。

我不会选择 Cassandra 或 Mongo 之类的东西,除非你有真正令人信服的理由需要持久存储。理由:清除可能会变得非常繁重,尤其是当您的数据移动速度很快时。例如:Cassandra 并不真正知道如何删除,而是 "tombstones" 删除条目,这意味着您的数据存储将不断增长,直到您创建清除策略。

如果您已经拥有 WebSphere ND 8.5.5,您可以看看随附的 WebSphere Extreme Scale。它是与 WebSphere 集成的分布式分区缓存解决方案。有关详细信息,请参阅 WebSphere eXtreme Scale overview

查看新的 JCache 标准(Java 社区流程中的 JSR 107)。此 API 由 Coherence 和其他缓存实现(ehcache 等)实现,还有一个小型参考实现,您可以将其用于基本用例。

是的,任何 Java 缓存框架都应该能够帮助您。 Coherence(注意:我在 Oracle 与 Coherence 合作)例如绝对可以轻松处理 3,00,000 个项目(如果你使用 lakh,我假设你来自印度!),但我建议仅在你将其部署在多个项目上时才使用 Coherence服务器。

对于缓存提供程序,我建议使用 Coherence,我在公司使用的是 Coherence,它非常健壮并且可以在多个集群上同步。

关于如何处理缓存的另一点,这取决于您的应用程序的性质,根据我对缓存的经验,我决定在以下情况下更新缓存: 1.网格分页 2.浏览

并决定清除缓存并重新加载数据:

  1. 编辑项目
  2. 添加新项目
  3. 删除项目

我决定维护缓存是一种过度头痛,当您处理某种统计数据和嵌套层次结构时,它会被吹到您的脸上。

希望对您有所帮助。