《系统设计》课程学习笔记—缓存

153 阅读6分钟

"There are only two hard things in Computer Science: cache invalidation and naming things." - Phil Karlton

caching.webp

缓存的主要目的是通过减少访问底层较慢存储层的需要来提高数据检索性能。以容量换取速度,缓存通常会暂时存储一个数据子集,不像数据库的数据通常是完整和持久的。

缓存利用了访问局部性原理“最近请求的数据可能会再次被请求”。

缓存和内存

与计算机的内存类似,缓存是一种简洁、快速执行的内存,它以层次结构存储数据,从一级开始,然后依次进行。它们被标记为L1、L2、L3等。如果有请求缓存也会被写入,例如当出现更新时,需要将新内容保存到缓存中,以替换保存的旧内容。

无论缓存是读还是写,每次都会执行一个块。每个块还具有一个标签,该标签包括数据存储在缓存中的位置。当从缓存中请求数据时,将通过标记进行搜索,以查找一级内存(L1)中所需的特定内容。如果找不到正确的数据,则在L2中进行更多搜索。

如果依旧找不到数据,则在L3、L4中继续搜索,直到找到为止,然后读取并加载数据。如果在缓存中根本找不到数据,则会将其写入缓存中,以便下次快速检索。

缓存命中和缓存丢失

缓存命中

缓存命中描述了从缓存成功提供内容的情况。标签会在内存中快速搜索,当找到并读取数据时,就被认为是缓存命中。

冷、温、热缓存

缓存命中也可以根据读取速度描述为冷、温或热。

热缓存是以尽可能的速率从内存中读取数据的实例。当从L1检索数据时会发生这种情况。

冷缓存是读取数据的最速率,但它仍然成功,因此仍被视为缓存命中。数据只是在内存层次结构中较低的位置,如L3或更低的位置。

温缓存用于描述在二级或三级缓存中找到的数据。它比热缓存慢,但比冷缓存快。通常,称缓存为温缓存用于表示它比热缓存更慢,更接近冷缓存。

缓存丢失

缓存丢失是指在搜索内存时未找到数据的实例。发生这种情况时,内容将被传输并写入缓存。

缓存失效

缓存失效是计算机系统将缓存项声明为无效并删除或替换它们的过程。如果数据被修改,则应在缓存中使其失效,否则可能导致应用程序行为不一致。有三种缓存系统:

直写(write-through)缓存

write-through-cache.webp 数据同时写入高速缓存和相应的数据库。

优点:快速检索,缓存和存储之间的完全数据一致性。

缺点:写入操作的延迟更高。

绕写(write-around)缓存

write-around-cache.webp

写入的数据直接进入数据库或永久存储,绕过缓存。

优点:这可能会减少延迟。

缺点:它增加了缓存丢失,因为缓存系统必须在缓存未命中的情况下从数据库中读取信息。因此,在应用程序快速写入和重新读取信息的情况下,这可能导致更高的读取延迟。从较慢的后端存储进行读取,并经历较高的延迟。

回写(write-back)缓存

write-back-cache.webp

仅对缓存层进行写入,并且一旦对缓存的写入完成,缓存将此写入异步地同步到数据库。

优点:这会减少写密集型应用程序的延迟和高吞吐量。

缺点:如果缓存层崩溃,则存在数据丢失的风险。我们可以通过让多个副本确认缓存中的写入来改进这一点。

驱逐策略

以下是一些最常见的缓存驱逐策略:

  • 先进先出(First In First Out,FIFO):缓存将首先访问的第一个块逐出,而不考虑之前访问的频率或次数。
  • 后进先出(Last In First Out,LIFO):缓存会先逐出最近访问的块,而不考虑它之前访问的频率或次数。
  • 最近最少使用(Least Recently Used,LRU):首先丢弃最近最少使用的块。
  • 最近最常使用(Most Recently Used,MRU):与LRU相反,首先丢弃最近最常使用的块。
  • 最不经常使用(Least Frequently Used,LFU):统计块被需要的频率。那些最不常用的首先被丢弃。
  • 随机替换(Random Replacement,RR):随机选择一个候选项,并在必要时丢弃它以腾出空间。

分布式缓存

distributed-cache.webp

分布式缓存是一种系统,它将多台联网计算机的随机存取存储器(RAM)汇集到单个内存数据存储中,用作数据缓存,以提供对数据的快速访问。大多数传统缓存位于同一个物理服务器或硬件组件中,分布式缓存可以通过将多台计算机链接在一起而超出单个计算机的内存限制。

全局缓存

global-cache.webp

顾名思义,我们将拥有一个所有应用程序节点都将使用的共享缓存。当在全局缓存中找不到请求的数据时,缓存负责从底层数据存储中查找未命中的数据。

使用场景

缓存有许多使用场景,例如:

  • 数据库缓存
  • 内容交付网络(CDN)
  • 域名系统(DNS)缓存
  • API缓存

何时不使用缓存?

我们来看一些不应该使用缓存的场景:

  • 当访问缓存的时间与访问主数据存储的时间一样长时,缓存没有帮助。
  • 当请求具有低重复性(更高的随机性)时,缓存不起作用,因为缓存性能来自重复的内存访问模式。
  • 当数据频繁更改时,缓存没有帮助,因为缓存的版本不同步,并且每次都必须访问主数据存储。

需要注意的是,缓存不应用作永久数据存储。它们几乎总是在易失性存储器中实现,因为它们更快,因此应被视为临时的。

优点

以下是缓存的一些优点:

  • 提高性能
  • 减少延迟
  • 减少数据库上的负载
  • 降低网络成本
  • 提高读取吞吐率

例子

以下是一些常用的缓存技术: