4

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

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

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

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

8 回答 8

2

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

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

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

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

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

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

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

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

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

于 2015-02-23T14:52:02.680 回答
1

问题是是否必须分布式缓存。请记住,缓存是您所见过的。并将其发布为可能有用的机会……好吧,为什么。

分布式缓存系统:Redis、Cassandra in Memory。内存中的MongoDB。

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

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

于 2015-02-23T14:20:18.360 回答
1

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

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

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

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

而且我已经决定维护缓存,当您处理某种统计数据和嵌套层次结构时,这将是一个过度头痛的问题。

希望这对您有所帮助。

于 2015-06-13T20:45:09.607 回答
0

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

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

于 2015-02-23T14:11:22.140 回答
0

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

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

于 2015-02-23T14:13:35.450 回答
0

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

于 2015-02-23T14:14:26.887 回答
0

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

于 2015-02-23T19:17:44.150 回答
0

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

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

于 2015-03-04T21:38:02.707 回答