2014-11-23 200 views
2

我在寻找可处理大数据的内存缓存解决方案(< 5GB)。对于用户输入的搜索词,数据库(elasticsearch)将返回大量的数据,工具将通过该工具的不同网页分析和显示大量数据。现在我的问题是,我想暂时缓存这些大数据,直到用户会话结束,这样每次用户打开一个新页面时,我都不必从elasticsearch再次获取它。它将不得不在内存中,因为基于磁盘将花费一分钟,这将非常缓慢。缓存内存中的大量数据

我最初认为memcached,但它的最大限制为128MB。阅读了很多后,Redis看起来很合适,但是我不清楚一堆Redis节点是否可以协同工作。是否可以建立多个Redis节点池,以便在SETGET上自动选择合适的节点,而无需我指定节点?

TL; DR

  • 问题:在内存中缓存缓存大数据(< 5GB)
  • 可能的解决方案:Redis的
  • 问题:我能汇集一堆Redis节点,这样我就可以在没有指定特定节点的情况下获取存储在其中任何一个中的密钥。我不需要分发我的数据,因为单个用户的数据将适合单个节点的RAM。
+0

确保您没有过度优化。 5 GB听起来像很多数据,但除非是每个用户,否则其实并不多。 Elasticsearch'filter'结果在默认情况下被缓存(有些例外,如脚本和地理操作),因此后续搜索应该很快返回(除1.4中有少数例外情况外,不会对缓存查询进行缓存)。 – pickypg 2014-11-24 02:47:45

+0

Yup 5GB是每个用户。但由于它是一个B2B工具,用户数量有限。此外,如果用户数量增加,我可以添加更多的节点,因为单个用户的数据仍然适合单个节点的RAM。在elasticsearch中,我使用扫描和滚动,其中的结果,我假设没有缓存? – huhahihi 2014-11-24 09:13:32

回答

0

Redis集群听起来很适合您的用例!

Redis集群提供了一种通过哈希槽进行数据分片的机制。这些插槽在设置时均匀分布在群集中的节点上。

只要您在缓存器中存储值,就会计算给定密钥的相应散列槽,并将数据转发给负责节点。您可以用同样的方法查询您的数据。 所以你的问题的答案肯定是肯定的。

但是,每个密钥的最大值大小为512MB。我不确定我的存储需求是否正确。我假设5GB是所有用户的估计总金额。

结帐redis cluster tutorial

+0

请注意,使用Redis群集选择分片是基于对密钥名称(或其中的一部分)进行散列处理,而不是基于利用率。 – 2014-11-23 17:40:05

+0

@Moritz不,每位用户5GB。据我了解,512 MB的限制只适用于字符串数据类型,但如果数据保存为列表,这个限制将不适用?纠正我,如果我得到这个错误。 – huhahihi 2014-11-24 09:29:05

+0

@ItamarHaber是否意味着不存在动态负载平衡,并且我将不得不重新启动群集以添加新节点?另外,如果节点发生故障,我的数据是否会继续前往故障节点,因为该节点已映射到特定的数据段? – huhahihi 2014-11-24 09:31:48

1

您也可以看看NCache(.NET)/ Tayzgrid(JAVA)由Alachisoft

这些解决方案都提供分布与动态集群缓存,它允许添加或使用了运行时删除群集节点丢失任何数据。智能客户端也确保参考适当的节点来获取/存储对任何密钥的记录。