Caching 关于数据库缓存的澄清

Caching 关于数据库缓存的澄清,caching,redis,memcached,Caching,Redis,Memcached,如果我错了,请纠正我的错误,但据我所知,“数据库缓存”通常是通过web服务器(与web服务器相同的机器)本地的内存中数据库实现的。此外,这些“数据库缓存”存储查询的实际结果。我还阅读了多种缓存策略,如:搁置缓存、读通、写通、写在后面、写在周围 在某些情况下,直写策略如下所示: 缓存搁置策略如下所示: 我相信“应用程序”是指带有RESTAPI的后端服务器 我的第一个问题是,在直写策略中(应用程序写入缓存,缓存然后写入数据库),这是如何工作的?据我所知,最常用的数据库缓存是Redis或Memcac

如果我错了,请纠正我的错误,但据我所知,“数据库缓存”通常是通过web服务器(与web服务器相同的机器)本地的内存中数据库实现的。此外,这些“数据库缓存”存储查询的实际结果。我还阅读了多种缓存策略,如:搁置缓存、读通、写通、写在后面、写在周围

在某些情况下,直写策略如下所示: 缓存搁置策略如下所示:

我相信“应用程序”是指带有RESTAPI的后端服务器

我的第一个问题是,在直写策略中(应用程序写入缓存,缓存然后写入数据库),这是如何工作的?据我所知,最常用的数据库缓存是Redis或Memcached,它们只是键值存储。假设有一个关系数据库作为主数据库,这些键值存储将如何写回关系数据库?这些策略是否仅适用于主数据库也是键值存储的情况

在写通(或读通)策略中,缓存位于应用程序和数据库之间。这到底是怎么回事?如何让缓存与数据库服务器通信?据我所知,web服务器(应用程序)始终是促进缓存和主数据库之间通信的服务器,这基本上是一种缓存搁置策略。除非Redis具有某种功能,允许它与另一个数据库进行通信,否则我不太明白它是如何工作的

难道不能混合和匹配缓存策略吗?从我的观点来看,Cache-Aside和Read-Through是应用程序读取(用户想要读取数据)的缓存策略,而Write-Through和Write-Behind是应用程序写入(用户想要写入数据)的缓存策略。你不能有一个既使用缓存又使用写通的策略吗?为什么大多数文章似乎总是把它们描绘成独立的策略

如果您有一个Web服务器集群,会发生什么?它们是否都有自己的本地内存中数据库作为缓存

能否使用普通(非内存)数据库实现缓存?我想这还是有点有用的,因为您不需要向数据库服务器进行额外的网络跳操作(因为缓存与web服务器位于同一台机器上)

简介和说明 我想您误解了一点,缓存没有明确地存储在与werbserver相同的服务器上。有时,甚至数据库也不是从Web服务器在其自己的服务器上指定的。如果您想到API,比如HTTP REST API,您可以使用缓存来避免在数据库连接和查询上花费太多资源。通常,您希望使用尽可能少的数据库连接和查询。现在想象以下设置:

您有一个为您的应用程序提供服务的werbserver和一个RESTAPI,Web服务器使用它来处理一些资源。这些资源来自同样存储在同一服务器上的数据库(比如关系数据库)。现在有一个端点服务于
帖子列表
(如博客帖子)。每个用户都可以获取所有帖子(在本例中使其变得简单)。现在我们有了一个例子,可以说这个API请求可以被缓存,不让所有用户总是触发数据库,只是一遍又一遍地查询相同的资源(通过RESTAPI)。缓存来了。Redis是许多可用于缓存的工具之一。因为redis是一个简单的内存键值存储,所以您可以在第一次DB查询之后将所有POST(记住RESTAPI)放入缓存。所有将来对posts列表的请求都将首先检查posts是否已经缓存。如果是,API将返回此特定请求的缓存内容

这是一个简单的示例,可以展示缓存的用途

回答你的问题 我的第一个问题是,你为什么要写缓存

减少数据库连接和查询的数量

写入这些键值存储将如何帮助更新关系数据库

它不会帮助您进行更新,而是帮助您节省资源。它还可以帮助您“临时备份”一些数据,但这只是一个非常小的副作用。为此,有更具吸引力的解决方案(因为redis在默认情况下也不是持久的)

这些缓存写入策略是否仅适用于主数据库也是键值存储的情况

不,使用哪个数据库并不重要。无论是NoSQL还是SQL数据库。这在很大程度上取决于要缓存的内容以及数据库及其表的设置方式。你的资源经常变动吗?资源是手动更新还是仅在用户启动的操作上更新?这些问题将引导您找到正确的缓存实现

难道不能混合和匹配缓存策略吗

我不是缓存策略方面的专家,但让我试试: 我想这是可能的,但这也很大程度上取决于你在数据库中做什么,以及你有什么样的应用程序。我想,如果你发现你正在构建什么样的应用程序,那么你就会知道,你必须使用什么策略——我想也不建议将这些策略混合在一起,因为这些策略与你的应用程序类型是耦合的——换句话说,它不会很好地工作

如果您有一个Web服务器集群,会发生什么?它们是否都有自己的本地内存中数据库作为缓存

我想两者都有可能。通常,您有一个数据库,可能是集群数据库或与副本同步的数据库,您的Web服务器(例如RESTAPI)会向其发出请求。那么你们每个API服务器是否都有自己的c