Java,关于缓存成吨GB的策略的帮助?

Java,关于缓存成吨GB的策略的帮助?,java,caching,Java,Caching,我们正在处理天气数据和存储在数据库中的大约十年的气象站数据。 我们已经构建了一个restapi,给定一天,一个站和一个测量变量以JSON格式返回数据。构建小型应用程序的性能很好,但少量查询不适合高流量 我们正在考虑缓存(和预缓存)每个day station变量的JSON数据。最初我们在Redis上进行了尝试,但问题是我们的数据高达400Gb 以下是我寻求帮助和类似经验的时候: -将数据转储到磁盘文件是一个好主意,其中每个文件都包含day station变量查询的JSON结果? -有没有使用EhC

我们正在处理天气数据和存储在数据库中的大约十年的气象站数据。 我们已经构建了一个restapi,给定一天,一个站和一个测量变量以JSON格式返回数据。构建小型应用程序的性能很好,但少量查询不适合高流量

我们正在考虑缓存(和预缓存)每个day station变量的JSON数据。最初我们在Redis上进行了尝试,但问题是我们的数据高达400Gb

以下是我寻求帮助和类似经验的时候: -将数据转储到磁盘文件是一个好主意,其中每个文件都包含day station变量查询的JSON结果? -有没有使用EhCache或JCS的经验?它们适合这个吗


干杯。

我花2美分买了一个大数据存储

首先,它不适合基于文件的数据存储解决方案。这基本上说明您的数据是有磁盘IO限制的,您很难实现像Oracle这样的商业数据库对其磁盘IO访问所做的优化,即使您是某种“基于对象的文件结构”。我过去缓存此类数据的经验使用内存缓存技术,如一致性缓存。基本上,您构建了一个服务器集群,每个服务器都有大量内存(比如48GB),并且您将所有对象缓存在内存中。把它想象成一个带有冗余因子的大型散列映射,您可以对其进行配置。您可以自定义方式定义密钥

其次,很明显,您的解决方案是有空间限制的,您可以考虑将一些压力转移到CPU限制上——通过压缩JSON格式;或者存储二进制数据并实时转换为JSON。这应该能够将您的数据压缩到一个很大的比例。您需要选择适当的格式,这样CPU就不会过载,但我想这是不太可能的


上述假设基于以下假设:查询是单一的,即查询(日期、车站)的单一组合。如果您有其他频繁的查询,则需要使用一些支持数据结构,如索引。

我的2美分用于大型数据存储

首先,它不适合基于文件的数据存储解决方案。这基本上说明您的数据是有磁盘IO限制的,您很难实现像Oracle这样的商业数据库对其磁盘IO访问所做的优化,即使您是某种“基于对象的文件结构”。我过去缓存此类数据的经验使用内存缓存技术,如一致性缓存。基本上,您构建了一个服务器集群,每个服务器都有大量内存(比如48GB),并且您将所有对象缓存在内存中。把它想象成一个带有冗余因子的大型散列映射,您可以对其进行配置。您可以自定义方式定义密钥

其次,很明显,您的解决方案是有空间限制的,您可以考虑将一些压力转移到CPU限制上——通过压缩JSON格式;或者存储二进制数据并实时转换为JSON。这应该能够将您的数据压缩到一个很大的比例。您需要选择适当的格式,这样CPU就不会过载,但我想这是不太可能的


上述假设基于以下假设:查询是单一的,即查询(日期、车站)的单一组合。如果您有其他频繁的查询,则需要使用一些支持数据结构,如索引。

在Java中缓存这一数量的数据不是最佳选择。如果使用较大的堆大小,则会出现GC暂停或需要对其进行大量调优。您可以使用BigMemory选项进行EHCache。然而,这意味着,在每个请求上,CPU都需要从堆外内存中反序列化Java对象,并再次生成JSON数据

因此,尽管这是用Java缓存标记的,我还是建议使用非Java解决方案

我认为对URL的响应永远不会改变,因为您正在查询过去的天气信息。因此,只需安装适当的HTTP缓存头,让前端(缓存)web服务器来完成所有操作。对于前端缓存服务器,nginx或varnish产品非常常用

另一种选择是预生成JSON文件,只提供静态文件。这并不像看上去那么糟糕。操作系统可以很好地缓存文件和内容,在Linux和BSD上有sendfile系统调用,因此操作系统会将文件内容直接填充到TCP缓冲区中。预先制作文件版本的压缩版本也是一件好事。如果accept encoding头中包含压缩,则可以将web服务器配置为自动拾取后缀为.gz的文件。由于所有web客户机通常都支持压缩,因此这些文件将是您的操作系统在内存中保存的文件,并可以快速为它们提供服务

只要文件系统中有文件,系统内存就可以被操作系统高效、完整地用于缓存。如果你把任何其他存储或处理的东西放在这个问题上,你有更多的“旋钮”需要调整,我怀疑你会得到更好的结果


祝你好运

在Java中缓存这么多的数据不是最好的选择。如果使用较大的堆大小,则会出现GC暂停或需要对其进行大量调优。您可以使用BigMemory选项进行EHCache。然而,这意味着,在每个请求上,CPU都需要从堆外内存中反序列化Java对象,并再次生成JSON数据

因此,尽管这是用Java缓存标记的,我还是建议使用非Java解决方案

我认为对URL的响应永远不会改变,因为您正在查询过去的天气信息。因此,只需安装适当的HTTP缓存头,让前端(缓存)web服务器来完成所有操作。对于前端缓存服务器,nginx或varnish产品非常常用

另一种选择是预生成JSON文件,只提供静态文件。这并不像看上去那么糟糕。运算符可以很好地缓存文件和内容