提到缓存,最容易想到的便是Redis了。Redis凭借其出色的性能表现,十分适合做缓存。那么为什么需要缓存这个东西以及缓存用在哪些地方呢?
一、基本原理
存储层次模型
注:也是背景来源
想要设计好的架构或者应用、程序,一个稳定的思想、原理至关重要。计算机系统结构中的八大伟大思想,指引我们设计的计算机体系结构十分高效。其中的 存储层次结构 是至关重要的 一点,现代计算机的存储层次大致如下图所示。
对于用户角度,我们最关心的便是 响应速度,它也是性能指标的核心指标。任何程序应用都是以用户为中心,因此设计 应用 我们在满足功能的情况下则会去 追求 尽可能的 快!。而对于 程序 的 运行 基本上会经历以下步骤:
- 编写文本文件,即源程序(静态文件),存储于 磁盘
- 创建进程:为程序分配内存资源等,将程序装载至内存。
- 启动程序:进程调度至CPU,将PCB的虚拟地址空间的信息加入至寄存器(上下文切换时,会将基地址写入唯一的 基地址寄存器)
- CPU读入内存中程序段,然后数据段等程序信息。(省略MMU进行虚拟地址转换等步骤)
- CPU进行程序的处理,读取CPU Cache ,寄存器(指令寄存器)
- 进行计算、存储等操作
在这过程中,越离CPU的近的地方速度则越快。所以说我们为了更快则需要将程序尽可能离CPU近,但是 资源是稀缺的,越快则意味着造价越高,我们需要在 成本 和 性能之间做出平衡。因此,我们只有想办法,让我们离CPU近的地方尽可能地存放我们需要使用的数据。这是则出现了另外一个重要的思想:程序局部性原理。
局部性原理
大约是1961年时,该思想被提出来。程序局部性原理,是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域,具体来说,局部性通常有两种形式:时间局部性和空间局部性。
-
时间局部性:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
-
空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
这种概率统计学理论,的确也十分符合人的自然规律,例如80%的财富掌握在20%手中,考试也总是喜欢考察20%的重点内容。而该种思想和 预测 (指令分支预测)有点相似。
因此,缓存则基于以上的背景诞生了。用容量较小但性能较高的存储器去存储大量数据中重要(频繁使用)的数据。
二、场景应用
计算机系统
- 内存和CPU寄存器间:CPU Cache;同时一次性读取Cache Line的数据,来预测下次访问。
- MMU中的 页表(存于内存)和寄存器:TLB,快表,加快地址映射速度。
网络应用
- DNS解析过程中的(浏览器、OS的缓存)
- Cookie
系统级应用
- MySQL BufferPool对磁盘数据
Java开发应用
- Mybatis的缓存机制
- Redis做热点数据缓存
三、思考总结
作用
缓存也是加一个抽象层/中间层。它的作用是缓解压力,提升速度(和消息队列中间件的作用类似);而像OS这样的中间层(加在硬件和用户间的)是易用性,提升用户的可操作性)
问题
加了抽象层,则会带来复杂性。例如redis和database之间的双写问题处理。CPU Cache中多核情况下考虑一致性问题。【归纳来说则是一致性问题-上下级的一致性】,追求的目标则是尽可能 缓存 高命中率 的数据,及时淘汰不需要的数据。【以及考虑缓存预读问题和污染问题等】