缓存是一种基础的计算技术,它能够让频繁访问的数据被快速检索。亚马逊进行的一项研究发现,页面加载时间每增加 100 毫秒,销售额就会损失 1%。通过将频繁访问的数据存储在更快的存储介质中(通常是内存),缓存可以提高数据检索速度,进而提升整体系统性能。这凸显了缓存对用户体验乃至业务成功的重大影响。
以下是本系列将要涵盖的主题列表:

定义:根据维基百科的解释:“在计算领域,缓存是一种硬件或软件组件,它存储数据以便将来对该数据的请求可以更快地得到服务;缓存中存储的数据可能是早期计算的结果,也可能是存储在其他地方的数据副本。”
让我们来看一个具体的例子。
当客户端/服务器请求在不使用缓存的情况下发起时,客户端向服务发送请求,服务随后从存储中检索数据并将其发送回客户端。然而,在高流量情况下,从存储中检索数据可能会变得缓慢且过载。

在系统中添加缓存可以帮助克服这些限制。当请求数据时,服务首先检查缓存中是否有该数据。如果数据存在于缓存中,它会迅速返回给服务。如果数据未在缓存中找到,服务会从存储中检索它,将其存入缓存,然后响应客户端。这样可以更快地检索频繁访问的数据,因为缓存通常将数据存储在针对快速访问优化的数据结构中(内存)。

缓存系统与存储系统在几个方面有所不同。首先,缓存系统将频繁访问的数据存储在内存中,而存储系统将数据存储在磁盘上。由于内存比磁盘更昂贵,缓存系统的数据容量通常远小于存储系统。这意味着缓存系统只能存储总数据集的一个子集。
其次,缓存系统中存储的数据并非为长期数据持久化和耐久性而设计。缓存系统用于提高性能,它们不提供持久的数据存储。相比之下,存储系统旨在提供长期的数据持久化和耐久性,确保数据在需要时始终可用。
最后,缓存系统针对支持高流量和高并发进行了优化。通过将数据存储在内存中,缓存服务器可以快速响应传入的请求,这对于高流量网站或应用程序至关重要。而存储系统更适合持久化存储和管理大量数据。
如果请求的数据在缓存中可用,这被称为缓存命中(cache hit),否则称为缓存未命中(cache miss)。由于从缓存访问数据比从存储访问快得多,当缓存命中较多时,系统整体运行效率更高。缓存的有效性通过缓存命中率来衡量,即缓存命中次数除以缓存请求次数。比率越高表示整体性能越好。
虽然前面的例子展示了客户端/服务器计算中的缓存,但值得注意的是,缓存在现代计算机和软件系统中有着广泛的应用。

现代计算机利用多级缓存,包括 L1、L2 和 L3 缓存,为 CPU 提供对频繁使用数据的快速访问。
内存管理单元(MMU)负责将虚拟内存地址映射到物理内存地址。MMU 包含一个专门的缓存,称为转换后备缓冲区(Translation Lookaside Buffer,TLB),它存储最近使用的地址转换,以加速地址转换过程。
操作系统在主内存中使用页缓存(page cache)来提高整体系统性能。页缓存存储频繁访问的数据页,减少磁盘访问次数,从而避免系统变慢。
通过利用这些不同层次的缓存,现代计算机可以提高整体性能和效率。
在软件系统中,缓存在提升性能和减少网络延迟方面发挥着至关重要的作用。
浏览器使用缓存来存储频繁访问的网站图像、数据和文档,从而实现更快的加载时间和更流畅的浏览体验。这种缓存通常被称为浏览器缓存。
内容分发网络(Content Delivery Networks,CDN)是另一种用于交付静态资源(如图像、视频、CSS 文件和其他多媒体内容)的缓存形式。CDN 是一个地理上分布的代理服务器网络,它们协同工作,从离用户位置最近的服务器交付内容。这显著减少了访问内容所需的时间,从而实现更快的网站加载速度。
数据库中的缓存对于提高性能和减少执行开销至关重要。数据库中一些典型的缓存包括:缓冲缓存(buffer cache)、结果缓存(result cache)、查询缓存(query cache)、元数据缓存(metadata cache)和会话缓存(session cache)。这些缓存将频繁访问的数据块、查询结果、元数据和会话特定信息存储在内存中,以减少磁盘读取和查询执行时间,从而实现更快的查询响应时间和更好的用户体验。
两种广泛使用的缓存系统是 Memcached 和 Redis。它们是开源的高性能分布式缓存系统,可用于快速存储和检索数据。
缓存的实际应用场景包括:
- 在本地存储历史邮件,避免反复从服务器拉取相同数据
- 在 Twitter 等社交媒体网站上缓存热门推文
- 为闪购系统预加载和缓存产品信息,防止数据库压力过大
缓存是以下场景的有效解决方案:
- 数据变化不频繁
- 相同数据被多次访问
- 重复产生相同的输出
- 耗时查询或计算的结果值得缓存
虽然硬件和软件中有许多不同类型的缓存,但本文将重点关注系统设计中的一般缓存用例,探讨其原理、策略和问题。
本文为学习目的的个人翻译,译文仅供参考。
原文链接:A Crash Course in Caching - Part 1。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。