用于存储大量数据的Java缓存框架。
上下文:我们正在使用Jersey 2.6开发Restful服务,并将其部署在WAS 8.5上。该服务每天需要提供超过1000万个请求。
我们需要实现一个缓存来存储超过300k的对象(数据将来自数据库)。我们需要一些方法来每天更新缓存。
答案 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.浏览
并决定清除缓存并重新加载数据:
我已经决定保留缓存,当你处理某种统计数据和嵌套层次结构时,这会让你头疼不已。
希望这有助于你。
答案 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,如果你在不止一个上部署它服务器