elasticsearch 缓存与索引

guykilcj  于 2023-04-11  发布在  ElasticSearch
关注(0)|答案(3)|浏览(154)

缓存解决方案和索引解决方案之间的真实的区别是什么?在我看来,索引解决方案实际上是具有运行搜索查询能力的缓存(例如:是否有任何真实的的理由在同一个项目中同时使用缓存解决方案和索引解决方案,或者索引解决方案基本上使任何其他缓存冗余?
例如:假设我使用NEST进行ElasticSearch,它将存储并返回POCO;如果我随后查询ElasticSearch并返回POCO,这不被认为是使用从ElasticSearch返回的缓存对象吗?
目前,我使用一个ICacheManager接口将数据存储在缓存中,如下所示:

return CacheManager.Get(cacheKey, () =>
{
    // return something...
});

这会成为ElasticSearch的冗余吗?

编辑

感谢你们所有人的回答。我完全知道什么是缓存,并且已经理解了文本搜索索引背后的一般思想,所以我只是想知道索引是否已经兼作缓存,因此会使任何其他缓存冗余。毕竟,我不想在内存中保留2个缓存(例如:ElasticSearch + Redis)的时候,一个会做得很好。我想我现在有一个更好的主意虽然;特别是当我意识到并不是所有的字段都存储在索引中,因此我们需要从缓存中获取对象,或者直接从数据库中获取对象-至少在某些情况下是这样。

8e2ybdfx

8e2ybdfx1#

缓存的全部目的是尽可能快地返回已经请求的数据。缓存的一个限制是它们不能太大,因为查找时间会增加,从而破坏了缓存的初衷。也就是说,如果您计划在数据库中拥有数百万/十亿条记录,这并不奇怪。将它们全部编入索引并不困难,但将它们全部缓存起来就困难了,尽管由于RAM越来越便宜,您可能能够将所需的所有内容存储在内存中。您还需要问问自己是否需要将缓存分布在多个主机上(无论是现在还是将来)。
考虑到ES中的查找和查询速度极快(+ ES为您带来了更多的好处,除了这一点,如评分),即通常比从DB检索相同的数据更快,使用ES作为缓存是有意义的。我看到的一个问题是常见的,即一旦开始复制数据(DB -〉ES),您需要确保两个存储不会失去同步。
现在,如果你在这个混合中添加了一个缓存,它是第三个需要维护的数据存储,并确保与主数据存储一致。如果你知道你的数据非常稳定,即写入,然后不经常更新,那么这可能是可以的,但你需要在设计数据访问策略时始终记住这一点。
正如@paweloque所说,最终这一切都取决于您的具体用例。每个问题都是不同的,我可以证明,在过去五年左右的几十个ES项目中,我从未见过两个项目以相同的方式配置。缓存可能对某些特定情况有意义,但对其他情况则完全没有意义。
你需要认真考虑如何以及在哪里存储数据,谁在请求它们(以及以什么速度),谁在创建/更新它们(以及以什么速度),但最终,最佳实践是保持堆栈尽可能精简,只需要尽可能少的组件,每个组件都是你必须理解,集成,维护,调整和监控的潜在瓶颈。
最后,我想补充一点:添加缓存或索引应该被认为是软件堆栈的性能优化。正如您可能知道的常见说法"Premature optimization is root of all evil",您应该首先只使用数据库,测量性能,负载测试,然后见证它可能不支持负载。然后,您可以根据需要决定在数据库上添加缓存和/或索引。同样,负载测试,测量,然后再决定。如果你只有十个用户每天发出几个请求,那么只有一个数据库可能就很好了。你必须明白什么时候以及为什么你需要在你的巴别塔上添加另一层,但最重要的是你需要一次添加一层,看看这层是如何提高/降低堆栈的稳定性的。
最后但并非最不重要的是,您可以找到一些使用ES作为缓存的人的在线文章(主要是key-value storesobject caches)。

5anewei6

5anewei62#

您的问题:
缓存解决方案和索引解决方案之间的真实的区别是什么?
A.简单的区别是,缓存用于存储频繁使用的数据,以更快地服务于相同的请求。本质上,您的缓存比主存储更快,但大小更小,因此,它可以存储的数据(考虑到它更昂贵的共同点)
索引是对所有数据进行的,以使其更快地搜索。一个简单的Hashtable/HashMap将哈希作为索引,而在Array中,0和1是索引。
你可以索引一些列来更快地搜索它们。但是缓存是你想让你的数据更快地获取它们的地方。通常缓存是RAM而数据库是来自硬盘
缓存通常也是一个键值存储,所以如果你知道键,然后从该高速缓存中获取它,不需要运行查询。在NHibernate和EntityFrameworks中,查询缓存是以查询作为键插入的,所有数据都被缓存。现在你的查询将从缓存中获取,而不是通过数据库运行它。

eni9jsuy

eni9jsuy3#

有趣的问题!你确实可以使用elasticsearch来实现缓存。它提供了一些功能,可以让你的文档过期,但我不确定它们是否适合该高速缓存过期。问题是elasticsearch不是为缓存解决方案而构建的。它的最佳点是索引和查找文档。
索引是建立索引的任务,就像对书籍所做的那样:你读了整篇文章,并写下单词是在哪一页找到的,这使我们以后可以很快地找到单词在文章中的位置。
Elasticsearch提供了一个工具箱,允许您定义如何索引和处理文本,即应用词干。然后在下一步中,它将为您提供不同类型的查询来查找文档。
然而,你可以将文档写入elasticsearch,并使用文档的id来读取它。像这样,你可以将elasticsearch用作存储,它可能被用作缓存。

相关问题