如果我错了,请纠正我,但是据我了解,“数据库缓存”通常是使用Web服务器(与Web服务器相同的机器)本地的内存数据库来实现的。同样,这些“数据库缓存”存储查询的实际结果。我还阅读了多种缓存策略,例如-备用缓存,直读,直写,在后写,在四周写。
对于某些情况,直写策略看起来像这样:
而“缓存预留”策略如下所示:
我相信“应用程序”是指具有REST API的后端服务器。
我的第一个问题是,在直写策略中(应用程序写入缓存,然后缓存写入数据库),这是如何工作的?据我了解,最常用的数据库缓存是Redis或Memcached,它们只是键值存储。假设您有一个关系数据库作为主数据库,这些键值存储将如何写回到关系数据库?这些策略是否仅在您的主数据库也是键值存储的情况下适用?
在直写(或直读)策略中,缓存位于应用程序和数据库之间。那怎么工作?您如何使缓存与数据库服务器对话?根据我的理解,Web服务器(应用程序)始终是促进缓存和主数据库之间通信的服务器-这基本上是一种Cache Aside策略。除非Redis具有某种功能使其能够与另一个数据库对话,否则我不太了解它是如何工作的。
不可能混合和匹配缓存策略吗?从我的角度来看,“超速缓存”和“直读”是应用程序读取的缓存策略(用户要读取数据),而“直写”和“后写”则是应用程序写入的缓存策略(用户要写入数据)。您难道没有同时使用缓存预留和直写的策略吗?为什么大多数文章似乎总是将它们描绘成独立的策略?
如果您有一组Web服务器会怎样?他们每个人都有自己的本地内存数据库作为缓存吗?
您可以使用普通(非内存中)数据库实现缓存吗?我想这仍然会很有用,因为您不需要对数据库服务器进行额外的网络跳转(因为缓存与Web服务器位于同一台计算机上)?
答案 0 :(得分:0)
我想您可能有一个误解,那就是缓存未明确存储在与werbserver相同的服务器上。有时,甚至没有从Web服务器在其自己的服务器上分离数据库。如果您想到的是HTTP REST API之类的API,则可以使用缓存在数据库连接和查询上不花费太多资源。通常,您希望使用尽可能少的数据库连接和查询。现在想象一下以下设置:
您有一个为您的应用程序提供服务的werbserver和一个REST API,网络服务器使用该REST API处理某些资源。这些资源来自数据库(更不用说关系数据库),该数据库也存储在同一服务器上。现在有一个端点服务于posts
的列表(如博客文章)。每个用户都可以获取所有帖子(在此示例中,此操作很简单)。现在,我们可以说可以缓存此API请求,而不是让所有用户总是触发数据库,而只是一次又一次地查询相同的资源(通过REST API)。 这里是缓存。 Redis是可用于缓存的众多工具之一。由于redis是一种简单的内存键值存储,因此您只需将所有数据库查询后的所有帖子(记住REST API)放入缓存中即可。以后对帖子列表的所有请求都将首先检查帖子是否已被缓存。如果是这样,API将为此特定请求返回缓存内容。
这是一个简单的示例,展示了可以使用什么缓存。
我的第一个问题是,为什么要写入缓存?
减少数据库连接和查询的数量。
如何写这些键值存储来帮助更新关系数据库?
它不会帮助您进行更新,而是可以帮助您减少资源消耗。它还可以帮助您“临时备份”某些数据-但这只是很小的副作用。为此,存在更有吸引力的解决方案(由于redis默认也不是持久性的。But it supports persistence.)
仅当您的主数据库也是键值存储时,这些高速缓存写入策略才适用吗?
否,使用哪个数据库并不重要。无论是NoSQL还是SQL DB。这在很大程度上取决于您要缓存的内容以及数据库及其表的设置方式。您的资源经常变化吗?资源是手动更新还是仅在用户启动的操作上更新?这些都是问题,可以引导您进行正确的缓存实施。
混合和匹配缓存策略是否可行?
我不是缓存策略方面的专家,但让我尝试: 我想这是可能的,但也高度取决于您在数据库中正在执行的操作以及所拥有的应用程序类型。我想如果您发现要建立的种类的应用,那么您将知道必须使用哪种策略-我猜也不建议您将这些策略混合使用,因为这些策略与您的应用程序类型相关联-换句话说:效果不太好。
如果您有一组Web服务器会怎样?他们每个人都有自己的本地内存数据库作为缓存吗?
我想两者都有可能。通常,您有一个数据库,可能是集群的或与副本同步的,您的Web服务器(例如REST API)向其发出请求。然后,每个API服务器是否都具有自己的缓存,以根本不查询数据库(在基于云的应用程序中,数据库也可能位于另一台分离的服务器上-因此在网络方面是另一“跳”)。或者(我也可以想象)在API(集群化)和DB(也许也集群化)之间还有另一种中间件-但我想由于网络流量,没有人会这样做。这将导致更长的响应时间,这是您通常希望避免的。
您可以使用普通(非内存中)数据库实现缓存吗?
是的,但是会慢很多。机器可以更快地访问内存中的数据,然后建立与数据库的另一个(本地)连接并查询缓存的条目。另外,由于数据库必须将条目写到计算机上的文件中,因此才能持久存储数据。
总而言之,这一切都是关于响应时间的快速和防止大量网络流量。希望我能对您有所帮助。