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