关于缓存问题的思考与总结

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

以上是关于关于缓存问题的思考与总结的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019-1 20165301 《信息安全系统设计基础》第五周学习总结

Vue 简单的总结

关于缓存的几篇好文章

程序员职业生涯系列:关于技术能力的思考与总结

关于负载均衡的一切:总结与思考

从 专访DeepID发明者孙祎:关于深度学习与人脸算法的深层思考 总结