缓存,又称 memory cache,是一个高速内存存储器,从计算机硬件、操作系统到软件设计,缓存都是一个基础且核心的组件,在计算机的世界里无处不见。
先从我们熟悉的CPU说起,CPU的高速缓存是CPU结构中的一个部件,intel i7-10代有高达16M的高速缓存,高速缓存的随机存取比内存高效很多,CPU指令执行时数据访问首先访问高速缓存,缓存没有去读计算机内存,通过数据总线传输给CPU缓存返回给处理器。仅次于CPU高速缓存的存储部件就是内存,其次是低速存储设备磁盘,我们软件设计概念的缓存是指在内存上的数据存储区域。
程序运行环境所需数据都是存储在内存,高级语言提供的关键字new,new一个新的对象就是申请一块内存区域来存储,内存空间相比磁盘是昂贵的,区域是有限的,需要存储的数据超出的内存大小,就需要把数据存储到磁盘里,需要的时候读取到内存中,在计算操作系统设计上,为了程序执行的高效,使用了很多缓存设计。
当你在一台内存是4G的计算机上运行一个32位的可执行程序,程序文件首先被加载到内存,如linux上的使用的是mmap磁盘文件映射到内存空间,计算机操作系统上可以启动N个程序,32位程序的内存地址空间都是4G,计算机内存只有4G,内存不够了就要用到磁盘来存储也就是虚拟内存,当内存不够时,操作系统会把程序的暂未使用的数据页面换出到磁盘,如从地址0x70000000-0x70001000 当此程序运行需要这些数据时,操作系统会产生缺页中断信号,然后调度程序将存储到磁盘的数据换入到内存首地址为0x70000000的的内存中。
当你的程序调用fwrite将数据写入磁盘文件,为了提高程序执行效率,fwrite只是将数据存入到了IO缓冲区,操作系统在缓冲区满的时候将磁盘缓冲区中的数据写入磁盘,也可以调用fflush将数据写入系统缓冲区,fsync将系统缓冲区数据立即写入磁盘,一般磁盘也可以设置内存缓存区,用于提高磁盘性能。
数据库,消息队列都提供将数据缓冲区同步写入磁盘,异步写入磁盘的方式,MySql默认是事务提交时将io缓冲区中的redolog调用fflush写回磁盘,保证数据的不丢失。
我们在软件设计时,缓存写回磁盘可以使用同步写入,异步写入,异步写入磁盘一般从时间、缓冲区容量,特殊事件发生这几个维度来定义策略。