用于存储大量数据的 Java 缓存框架。
背景:我们正在使用 Jersey 2.6 开发一个 Restful 服务,并将其部署在 WAS 8.5 上。该服务每天需要处理超过 1000 万个请求。
我们需要实现一个缓存来存储超过 300k 的对象(数据将来自 DB)。我们需要一些方法来每天更新缓存。
- 是否建议使用这种缓存 300k 对象并每天更新它们的方法?
- 有没有支持这种功能的Java框架?
您的问题太笼统,无法得到明确的答案。您需要描述您要解决的问题是什么。
此外,一些更多的上下文信息会很有用,尤其是:
您以 30 万 (300k) 个数据点和 1000 万个请求的形式给出的数字意味着您预计平均每天会命中每个对象 33 次,这表明您更关心后端数据库负载而不是您的响应是最新的.
根据我的经验,有很多相当原始的解决方案比使用重量级分布式系统(如 Mongo、Cassandra 或 Coherence)要好得多。
我的第一反应是:保持简单 - 300k 对象存储在内部哈希表中并不算多,您每天刷新一次并在第一次请求时填充。
如果您需要水平扩展,我建议您使用 1 天缓存时间的 Memcache Spymemcached,当您找不到现有条目时填充。
我不会选择 Cassandra 或 Mongo 之类的东西,除非你有真正令人信服的理由需要持久存储。理由:清除可能会变得非常繁重,尤其是在您的数据快速移动的情况下。例如:Cassandra 并不真正知道如何删除,而是“墓碑”删除了条目,这意味着您的数据存储将不断增长,直到您创建清除策略。
问题是是否必须分布式缓存。请记住,缓存是您所见过的。并将其发布为可能有用的机会……好吧,为什么。
分布式缓存系统:Redis、Cassandra in Memory。内存中的MongoDB。
本地 RocksDB(让您存储 byte[] -> byte[])和 SSD 构成了一个很好的本地缓存层。您还可以在其上添加分布式层。通常比货架上的东西好。也应该易于实施。
每天 1000 万次请求并不多。在 10 小时内,您可以每秒处理 1Mio / 60 / 60 => 3000 个请求。根据您通常可以使用高效的前端和高效的后端的负担。我们可以每秒处理 40k 页和核心并拥有 24 个核心......你知道数学。内存中的数据没有完成...
对于缓存提供商,我建议使用 Coherence,我在我的公司使用 Coherence,它非常健壮并且可以在多个集群上同步。
关于如何处理缓存的另一点取决于您的应用程序的性质,根据我在缓存方面的经验,我决定在以下情况下更新缓存: 1. 网格分页 2. 浏览
并决定清除缓存并重新加载数据:
而且我已经决定维护缓存,当您处理某种统计数据和嵌套层次结构时,这将是一个过度头痛的问题。
希望这对您有所帮助。
是的,例如:Coherence、Hazelcast。都是分布式现金。 http://java.dzone.com/articles/sneak-peek-jcache-api-jsr-107
一般来说,您应该缓存您正在使用的内容,并且缓存应该始终保持同步,而不是每天同步。您将最近使用的对象放入缓存中,并通过缓存读取/写入数据库。
如果你有钱,最好的就是连贯性(它的声誉被大金融公司证明)
Hazelcast 是您可以使用的另一种分布式缓存内存,它比基于性能指标的一致性低一个级别。
可以试试ehcache。它可以用作查询缓存甚至休眠二级缓存。您可以配置实体在失效之前应在缓存中存储多长时间。
如果您已经拥有 WebSphere ND 8.5.5,您可以查看随它一起提供的 WebSphere Extreme Scale。它是与 WebSphere 集成的分布式、分区缓存解决方案。有关更多详细信息,请参阅WebSphere eXtreme Scale 概述。
请参阅新的 JCache 标准(Java Community Process 中的 JSR 107)。此 API 由 Coherence 和其他缓存实现(ehcache 等)实现,并且还有一个小型参考实现,可用于基本用例。
是的,任何 Java 缓存框架都应该能够为您提供帮助。例如,Coherence(注意:我在 Oracle 与 Coherence 合作)绝对可以轻松处理 3,00,000 个项目(如果您使用 lakh,我假设您来自印度!),但如果您将其部署在多个项目上,我建议仅使用 Coherence服务器。