关于缓存问题的思考与总结
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于缓存问题的思考与总结相关的知识,希望对你有一定的参考价值。
提到缓存,最容易想到的便是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的缓存)
- CDN缓存
- Cookie机制
系统级应用
- mysql BufferPool对磁盘数据
Java开发应用
- Mybatis的缓存机制
- JVM进程内缓存
- Redis做热点数据缓存
三、思考总结
作用
缓存也是加一个抽象层/中间层。它的作用是缓解压力,提升速度(和消息队列中间件的作用类似);而像OS这样的中间层(加在硬件和用户间的)是易用性,提升用户的可操作性)
问题
加了抽象层,则会带来复杂性。例如redis和database之间的双写问题处理。CPU Cache中多核情况下考虑一致性问题。【归纳来说则是一致性问题-上下级的一致性】,追求的目标则是尽可能 缓存 高命中率 的数据,及时淘汰不需要的数据。【以及考虑缓存预读问题和污染问题等】
-
缓存介质带来的不可靠性。(一般使用内存做缓存的话,若机器故障,如何保证缓存的高可用?可考虑对缓存进行分布式做成高可用,同时,需要接受这种不可靠不安全会给数据带来的问题,在异常情况下进行补偿处理,定期持久化等方式)
-
缓存的数据使得更难排查问题。因为缓存命中是随着访问随时变化的,缓存的行为难以重现,使得出现BUG很难排查。
-
进程内缓存可能会增加GC压力:在具有垃圾收集功能的语言中(如Java),大量长寿命的缓存对象会增加垃圾收集的时间和次数。
对比缓冲池、消息中间件
像缓冲池、消息中间件更多地是缓解读写的频率的压力,让调用的频率不那么集中在某个时间段来提升效率,例如 文件IO中的 缓冲IO则是在标准库设计 缓冲 ,先将 数据存入 缓冲 达到了一点量再统一写入,这样一来就减少了 IO的集中调用压力和进程的上下文切换压力。
对比缓存,更多需要去 预见 性,去预测 后面的命中率。
参考:https://blog.csdn.net/u013065023/article/details/54670694
以上是关于关于缓存问题的思考与总结的主要内容,如果未能解决你的问题,请参考以下文章