当前位置: 首页 > 面试题库 >

缓存与索引

澹台博文
2023-03-14
问题内容

缓存解决方案和索引解决方案之间的真正区别是什么?在我看来,索引解决方案实际上是具有运行搜索查询功能(例如:Elastic
Search)的缓存。是否有任何真正的理由在同一项目中同时使用缓存解决方案和索引解决方案,或者索引解决方案基本上会使其他任何缓存变得多余?

示例:假设我对ElasticSearch使用NEST,它将存储并返回POCO;如果我随后查询ElasticSearch并已将POCO返回给我,那是否不认为使用的是从ElasticSearch返回的缓存对象?

目前,我使用ICacheManager接口将数据存储在缓存中。

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

使用ElasticSearch会变得多余吗?

编辑

感谢大家的答案。我完全了解高速缓存是什么,并且已经理解了用于文本搜索的索引背后的一般思想,所以我只是真正想知道索引是否已兼用作高速缓存,因此是否会使其他任何高速缓存冗余。毕竟,当一个性能很好时,我不想在内存中保留2个缓存(例如:ElasticSearch
+
Redis)。我想我现在有一个更好的主意。尤其是当我意识到并非所有字段都始终存储在索引中时,因此至少在某些情况下,我们无论如何都需要从缓存中获取对象或直接从db中获取对象。谢谢大家!


问题答案:

缓存的全部目的是 尽可能快
地返回已经请求的数据。高速缓存的一个限制是,它们也不能太大,因为查找时间会增加,因此会破坏首先拥有高速缓存的目的。话虽这么说,如果您计划在数据库中拥有几百万条记录,也就不足为奇了,尽管由于RAM越来越多,对它们全部进行索引还是很困难的,这并不奇怪。越来越便宜,您也许可以将所需的全部存储在内存中。您还需要问自己是否需要在多个主机之间分配缓存(无论是现在还是将来)。

考虑到ES中的查找和查询非常快(+
ES不仅为您带来了很多好处,例如计分),即通常比从数据库中检索相同数据要快,因此将ES用作缓存是有意义的。我看到的一个问题是一个常见的问题,即,一旦开始复制数据(DB->
ES),就需要确保两个存储都不会不同步。

现在,如果您另外将高速缓存放入该混合中,那么它将是第三个要维护的数据存储,并确保与主数据存储一致。如果您知道自己的数据非常稳定,即编写然后不经常更新,那可能没问题,但是在设计数据访问策略时,始终需要牢记这一点。

就像@paweloque所说的,最终一切都取决于您的确切用例。每个问题都不尽相同,我可以证明,过去五年左右围绕ES开展了数十个项目之后,我从未见过两个项目以相同的方式进行配置。在某些特定情况下,缓存可能有意义,而在其他情况下则根本没有意义。

您需要认真考虑如何以及在何处存储数据,谁在要求它们(以什么速率),谁在创建/更新它们(以什么速率),但是最后,最佳实践是保持您的堆栈尽可能精简,只需要很少的组件,每个组件都是您必须了解,集成,维护,调整和监视的潜在瓶颈。

最后,我还要添加一件事:添加缓存或索引应被视为对软件堆栈的性能优化。众所周知,“过早的优化是万恶之源”,您应该首先只使用数据库,测量性能,对其进行负载测试,然后见证它可能不支持负载。只有这样,您才可以根据需要决定将高速缓存和/或索引扔给它。再次,进行负载测试,测量然后决定。如果您每天只有十个用户发出几个请求,那么仅拥有一个数据库可能就可以了。您必须了解何时以及为什么需要在Babel塔上添加另一层,但是最重要的是,您一次需要添加一层,并查看该层如何提高/降低堆栈的稳定性。

最后但并非最不重要的一点是,您可以从使用ES作为缓存(主要是键值存储和对象缓存)的人们那里找到一些在线文章。



 类似资料:
  • 问题内容: 一级缓存与hibernate中的查询缓存是否不同?我看过有关第一级和查询缓存的文章,所以我很困惑。 问题答案: 默认情况下,第一级缓存处于启用状态,并且基于每个会话。默认情况下,查询缓存未启用,它在多个会话之间共享,应始终与二级缓存一起使用。 要启用查询缓存,应使用以下属性:

  • 关于如何打开缓存有什么建议吗?

  • 问题内容: 我还没有使用过Redis,但我听说过它,并打算尝试将其作为缓存存储。 我听说Redis使用内存作为缓存存储数据库,那么如果我使用变量作为对象或字典数据类型来存储数据有什么区别?喜欢: Redis有什么优势? 问题答案: Redis是一个 远程 数据结构服务器。这肯定比仅将数据存储在本地内存中要慢(因为它涉及套接字往返来获取/存储数据)。但是,它也带来了一些有趣的属性: 应用程序的所有进

  • 我试图使用Spring Boot与咖啡因和一些注释函数。在我们的测试中,对控制器endpoint的异步调用出现了一些问题,这些问题似乎与我们使用非异步缓存的事实有关。 在做一些研究时,我看到了很多使用Caffeine手动使用的例子,但是在和Spring Boot和注释中找不到任何东西。看起来和具有非常不同的API。是否可以异步使用默认的Spring Boot? 谢谢

  • 我有一个spring/hibernate项目,我试图通过ehcache和terracotta将二级缓存添加到hibernate。一切似乎都很好,我甚至可以在terracota控制台中看到我试图缓存的实体的条目。但根据数据库的统计数据和日志,根本没有缓存任何内容! 负载命中率是0%,负载统计也是0。我做错了什么? 这是我所做的,我通过maven添加了所需的罐子。 更改了我的Hibernate属性以启

  • 当你使用本地(在内存中)缓存时,服务器可以缓存一些信息并快速地检索它,但是其他服务器不能访问这个缓存数据,他们需要到数据库中查询同样的信息。 如果你喜欢使用分布式缓存让其他服务器访问缓存的数据,由于它有一些序列化/反序列化和网络延迟开销,则需要注意:在某些情况下,它可能会降低性能。 缓存需要处理的另一个问题:缓存失效。 There are only two hard things in Compu