冷缓存和热缓存概念是什么意思?

79
我读了一篇论文,其中使用了术语“冷缓存”和“热缓存”。我在谷歌上搜索了这些术语,但没有找到有用的信息(只有一个帖子在这里)。
这些术语是什么意思?
5个回答

131

TL;DR 缓存就像汽车的冷发动机和热发动机之间的类比。冷缓存 - 没有任何值,无法提供加速,因为它是空的。温暖缓存有一些值,可以带给你加速效果。

缓存是一种结构,用于快速查找某些值(索引节点、内存页面、磁盘块等)。

缓存通过在快速搜索数据结构(哈希表、B+树)或更快的访问介质(RAM内存与HDD、SSD与HDD)中存储某种类型的短引用来工作。

为了能够进行快速查询,您需要使缓存保留值。让我们看一个例子。

假设您有一个具有某个文件系统的Linux系统。要在文件系统中访问文件,您需要知道文件在磁盘上的起始位置。此信息存储在inode中。为简单起见,我们说inode表存储在磁盘上的某个位置(所谓的“超级块”部分)。

现在想象一下,您需要读取文件/etc/fstab。为此,您需要从磁盘上读取inode表(10毫秒),然后解析它并获取文件的起始块,然后读取文件本身(10毫秒)。总共需要 ~20毫秒。

这是太多的操作了。因此,您正在添加一种缓存形式,即RAM中的哈希表。RAM访问速度为10纳秒,比磁盘快1000倍!在该哈希表中的每一行都保存着2个值。

(inode number or filename) : (starting disk block)

但问题在于,刚开始时你的缓存是空的,这种缓存被称为冷缓存。要利用缓存的好处,您需要使用某些值来填充它。这是如何发生的?当您正在寻找某个文件时,您会查找inode缓存。如果您未在缓存中找到inode(缓存未命中),则会执行完整的读取周期,包括读取inode表、解析和读取文件本身。但经过解析部分后,您将保存inode号码和已解析的起始磁盘块到您的缓存中。这样一直持续下去-您尝试读取另一个文件,您查看缓存,您得到缓存未命中(您的缓存是冷的),您从磁盘读取,然后在缓存中添加一行。

因此,冷缓存不会给您任何加速,因为您仍然从磁盘读取。在某些情况下,冷缓存使系统变慢,因为您需要做额外的工作(在表中查找额外的步骤)来热身您的缓存。

经过一段时间,您的缓存中将有一些值,并且在一段时间内,当您尝试读取文件时,您会在缓存中查找,BAM!您已经找到inode(缓存命中)!现在您有了起始磁盘块,因此跳过了读取超级块并开始读取文件本身!你刚刚节省了10毫秒!

那种缓存被称为暖缓存-具有一些值的缓存,这些值会使您获得缓存命中。


3
非常好的解释。非常感谢! - Saurabh Patil
1
提示:10纳秒比10毫秒快了10的6次方倍。 - Ivankovich

44

这里输入图片描述

背景:

缓存是一种更小更快的内存,它可以帮助避免CPU访问主内存(更大、更慢)以节省时间(缓存读取比从主内存读取快约100倍)。但是,如果程序需要的数据已经被缓存(从主内存读取到缓存中),并且该数据有效,则此操作才有用。此外,缓存随着时间的推移会填充数据。因此,缓存可能为空,也可能包含不相关的数据,也可能包含相关的数据。


现在来看你的问题:

冷缓存:缓存为空或包含不相关的数据时,CPU需要从主内存中进行较慢的读取来满足程序数据需求。

热缓存:缓存包含相关数据时,程序的所有读取都从缓存本身满足。

因此,热缓存是理想的,冷缓存则不是。


5

非常好的回应,@avd。

冷缓存(Cold Cache) 只是一个空白的缓存或者带有过时数据的缓存。

热缓存(Hot Cache) 则维护了系统所需的有用数据。它可以帮助您实现更快的处理速度; 主要用于请求的近实时处理。有些系统/流程需要在开始处理用户请求之前准备好某些信息,例如交易平台需要市场数据/风险信息/安全信息等才能处理用户请求。如果每个请求都必须查询数据库/服务以获得这些关键信息,将非常耗时。因此,通过热缓存缓存这些信息是个好主意。 这个缓存应该定期维护(更新/删除等); 否则,随着时间的推移,您的缓存可能会增长,并且可能会注意到性能下降。

创建热缓存的其中一种方法是惰性填充缓存,我的意思是随着请求的到来逐渐填充缓存;在这种情况下,初始请求会比较慢,但是后续请求会更快。另一种方法是在进程启动(或在用户请求开始之前)加载数据并保持缓存状态。


1
在多程序环境中,如果任务保留了其工作集的重要部分以前的执行历史记录,那么缓存被称为“热缓存”。
没有先前执行历史记录的缓存称为“冷缓存”。

1

在前端Web开发中有一个类似的概念,几乎所有好的js前端框架现在都会进行热缓存。

冷缓存:前端应用程序第一次调用后端服务器。

热缓存:在前端首次获取数据后,将其保存在本地缓存中。因此,下一次尝试调用后端时,它将从本地缓存中获取该项。

参考:在前端中缓存数据


冷/热是一对...缓存开始时是冷的,一旦数据填充到其中就会变暖。这可以称为“拉取”缓存,因为我们通过它读取我们的信息,并且它保留答案的副本以备下次使用。在数据预取、自我加热或源主动将数据推入缓存的情况下,我们将其称为“热”,因为缓存数据始终准备好了。在 F/E 上下文中,我倾向于使用“预热”的表达方式,因为数据不是独立加载到缓存中,而是与读取操作耦合在一起。不完全等同于热,但很接近。 - Richard Hauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接