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

4

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

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

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

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

3
1 lakh = 10^5,只是为了更清晰明了。 - Stefano Sanfilippo
8个回答

2
你的问题太过于笼统,无法得到明确的答案。需要描述你试图解决的问题。
  • 你是否担心响应时间?
  • 你是否想保护你的数据库免受繁重负载的影响?
  • 你是否期望扩展并希望确保能够处理未来的负载?

此外,更多的上下文信息会很有用,特别是:

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

根据您提供的数据点为300k和10M请求,意味着您预计每个对象平均会被访问33次/天,这表明您更关心后端数据库负载而不是实时响应。

根据我的经验,有很多相当原始的解决方案,比选择Mongo、Cassandra或Coherence等大型分布式系统要有效得多。

我的第一个建议是:保持简单- 300k对象不会造成太大的存储压力,可以使用内部哈希表存储,每天刷新一次并在第一次请求时填充。

如果需要水平扩展,则建议使用1天缓存时间的Memcache Spymemcached,当找不到现有条目时进行填充。

除非您真正有强烈的理由需要持久性存储,否则我不会选择像Cassandra或Mongo这样的东西。原因:清除可能变得非常繁重,特别是如果您的数据速度很快。例如:Cassandra实际上不知道如何删除,而是用“墓碑”标记已删除的条目,这意味着您的数据存储将不断增长,直到您创建一个清除策略。


事实上,我们关注您提到的三个问题!而且我们的数据将每天更新。回答您的问题 - “平均每天会请求多少百分比的数据人口?”,最多会使用50%的数据。 - Chandra Manthina

1

对于缓存提供程序,我建议使用Coherence,我在我的公司使用了Coherence,它非常强大,并且可以在多个集群之间同步。

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

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

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

我做出这样的决定是因为维护缓存会给你带来过多的麻烦,特别是当你处理某种统计数据和嵌套层次结构时。

希望这能帮助到您。


1
问题是缓存是否必须分布式。请记住,缓存是您看到的东西。将其发布以便可能有用...为什么呢。
分布式缓存系统:Redis、Cassandra和内存中的MongoDB。
本地RocksDB(让您存储字节[] - >字节[])和SSD构成了良好的本地缓存层。您还可以在其上添加分布式层。通常比货架上的产品更好。应该也很容易实现。
每天1000万个请求并不多。在最长10个小时内,您可以处理1百万/60/60 =>每秒3000个请求。根据您通常的投入,可以使用高效的前端和高效的后端。我们可以在每个核心上做到40,000个页面,并且拥有24个核心..你知道数学。数据在内存中没有进行缓存...

0
参见新的JCache标准(Java社区进程中的JSR 107)。这个API由Coherence和其他缓存实现(如ehcache等)实现,并且还有一个小型参考实现,可以用于基本用例。
是的,任何Java缓存框架都应该能够帮到您。例如,Coherence(注:我在Oracle工作)绝对可以轻松处理30万个项目(如果您使用"lakh"这个词,我猜想您来自印度!),但我建议只在部署在多台服务器上时才使用Coherence。

0

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

一般来说,您应该缓存您正在使用的内容,并且缓存应该始终保持同步而不是每天更新。您可以将最近使用的对象放入缓存中,并通过缓存进行读/写以访问您的数据库。


0

如果你有足够的资金,最好的选择是使用Coherence(其声誉已经得到大型金融公司的证明)。

Hazelcast是另一种分布式缓存内存,根据性能指标,它比Coherence低一个级别。


0
你可以尝试使用ehcache。它可以用作查询缓存,甚至是Hibernate二级缓存。你可以配置实体在被失效之前在缓存中存储的时间长度。

0
如果您已经拥有WebSphere ND 8.5.5,可以看一下随附的WebSphere Extreme Scale。它是一个分布式、分区缓存解决方案,可与WebSphere集成。请参阅WebSphere eXtreme Scale概述以获取更多详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接