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

时间:2015-02-23 14:08:58

标签: java caching ibm-was

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

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

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

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

8 个答案:

答案 0 :(得分:1)

问题是必须分发缓存。记住缓存是你见过的。并张贴这个可能有用的机会......好吧。

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

Local RocksDB(允许您存储byte [] - > byte [])和SSD可以创建一个精细的本地缓存层。您也可以在其上添加分布式图层。通常比货架上的东西更好。也应该易于实施。

每天1000万次请求并不多。在10小时的上衣你可以服务器1Mio / 60/60 =>每秒3000个请求。根据您的承受能力,您通常可以使用高效的前端和高效的后端。我们可以做到每秒40k页,核心和24核......你知道数学。内存中的数据没有完成任务......

答案 1 :(得分:1)

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

  • 您是否关注响应时间?
  • 您是否在尝试保护自己的数据库免于繁重的工作?
  • 期望必须扩展并希望确保您可以处理未来的负载吗?

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

  • 您的数据与您的请求相比有多动态?
  • 每天平均请求的数据量百分比是多少? (至少每天会询问三十万件物品中的多少一件?如果您不知道,请提供最佳猜测。)

您提供的数据为3万(300k)数据点和10M请求意味着您希望每天平均击中每个对象33次,这表明您更关心后端数据库负载而不是您的响应正确最新的。

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

我的第一个回答是:保持简单 - 300k对象不能存储在内部哈希表中,每天刷新一次并在第一次请求时填充。

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

除非你有真正令人信服的理由要求持久存储,否则我不会选择像Cassandra或Mongo这样的东西。理由:清除可能变得非常繁重,特别是如果您的数据快速移动。例如:Cassandra并不真正知道如何删除,而是" tombstones"删除的条目,这意味着您的数据存储将会增长和增长,直到您创建清除策略。

答案 2 :(得分:1)

对于缓存提供商,我建议使用Coherence,我在我公司使用Coherence,它在多个集群中非常强大且同步。

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

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

  1. 修改项目
  2. 添加新项目
  3. 删除项目
  4. 我已经决定保留缓存,当你处理某种统计数据和嵌套层次结构时,这会让你头疼不已。

    希望这有助于你。

答案 3 :(得分:0)

是的,例如:Coherence,Hazelcast。所有都是分配的兑现。 http://java.dzone.com/articles/sneak-peek-jcache-api-jsr-107

通常,您应该缓存正在使用的内容,并且缓存应始终保持同步而不是每天。您将缓存放在最近使用的对象中,然后通过缓存读取/写入数据库。

答案 4 :(得分:0)

如果你有钱,最好的就是连贯性(其声誉由大型金融公司证明)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

请参阅新的JCache标准(Java Community Process中的JSR 107)。此API由Coherence和其他缓存实现(ehcache等)实现,还有一个小的参考实现,可用于基本用例。

是的,任何Java缓存框架都应该能够为您提供帮助。 Coherence(注意:我在Oracle的Coherence工作)例如可以很容易地处理3,00,000个项目(假设你使用的是10万个来自印度!)但我建议只使用Coherence,如果你在不止一个上部署它服务器