在内存中缓存大量数据

6
我正在寻找一个能够处理大数据(<5GB)的内存缓存解决方案。对于用户输入的搜索词,数据库(elasticsearch)将返回大量数据,该工具将通过工具的不同网页进行分析和展示。现在我的问题是,我想临时缓存这些大数据,直到用户会话结束,这样我就不必每次用户打开新页面时都从elasticsearch获取它。它必须是内存缓存,因为基于磁盘的缓存需要超过一分钟,这将非常慢。
我最初认为memcached可以,但其最大限制为128MB。经过阅读后,Redis似乎是适合的选择,但我不清楚一堆Redis节点是否可以协同工作。是否可以设置一组多个Redis节点池,以便在SET期间自动选择合适的节点,并在GET期间返回数据,而无需指定节点?
TL;DR: 问题:将大数据(<5GB)缓存在内存缓存中 可能的解决方案:Redis 问题:是否可以汇集一群Redis节点,以便在不指定特定节点的情况下获取存储在其中任何节点上的键?我不需要分发我的数据,因为单个用户的数据将适合单个节点的RAM。

请确保您不要过度优化。5 GB听起来像是很多数据,但如果它是每个用户的话,实际上并不算太多。 Elasticsearch的filter结果默认情况下会被缓存(有一些例外,比如脚本和地理操作),因此后续搜索应该能够快速返回(评分查询不会被缓存,除了从1.4开始的一些例外情况)。 - pickypg
是的,每个用户的限制是5GB。但由于这是一种B2B工具,用户数量会受到限制。此外,如果用户数量增加,我可以添加更多节点,因为单个用户的数据仍然可以适应单个节点的RAM。在elasticsearch中,我正在使用扫描和滚动,我假设其结果没有被缓存? - yogk
2个回答

1
一个Redis Cluster对你的使用场景听起来很适合!
Redis cluster通过哈希槽提供数据分片机制。在设置集群时,这些槽被平均分布在各个节点上。
每当您在集群中存储值时,都会计算给定键的相应哈希槽,并将数据转发到负责节点。然后您可以通过同样的方式查询数据。所以答案肯定是肯定的。
但是,每个键的最大值大小为512MB。我不确定我是否正确理解了您的存储需求。 我假设5GB是所有用户的预计总量。
请查看redis cluster tutorial

请注意,Redis Cluster中的分片选择是基于对键名(或其一部分)进行哈希而不是基于利用率。 - Itamar Haber
@Moritz 不是的,5GB是每个用户的限制。据我所知,512MB的限制仅适用于字符串数据类型,但如果数据保存为列表,则不会应用此限制?如果我理解有误,请纠正我。 - yogk
@ItamarHaber 这是否意味着没有动态负载平衡,我必须重新启动集群才能添加新节点?此外,在节点故障的情况下,我的数据是否仍将继续流向失败的节点,因为该节点被映射到特定的数据段? - yogk
添加新节点时无需重新启动集群,且具备迁移分片的能力。除了根据其(哈希)键名分配数据之外,没有负载均衡。如果需要可用性,则需要设置(并提升)从副本。 - Itamar Haber
1
关于限制问题 - 你是正确的。一个日期结构的元素在大小上是独立有限制的,但你可以有一个包含10个项目的列表,其中每个项目为512MB。 - Itamar Haber
只是一个问题。假设我的数据框大约有700MB,我想要缓存它。在缓存之前,我应该将其分块还是Redis集群知道如何分配数据? - Amirsalar

1
你可以了解NCache(.net) / Tayzgrid(java),它们由Alachisoft提供,这两个解决方案都提供动态集群的分布式缓存,允许在运行时添加或删除集群中的节点而不会丢失任何数据。智能客户端还确保引用适当的节点来获取/存储任何键的记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接