基础篇
技术是一条很长的路,走到最后除了热爱还需要坚持!
一、Redis诞生背景
时代背景
基于冯诺依曼体系所述,计算机系统由运算器,控制器,存储器,输入设备,输出设备五个部分组成(考研真题)。但有的资料更细分为七大组成部分,添加了内存和总线。这里规范是五大组成部分,后面的应该是随着时代发展,在Cache出现之后的"新·冯诺依曼体系"。我们在冯诺依曼体系的基础上建立计算机信息时代,走过了光盘(DVD)时代与磁盘时代,再穿过内存时代,最后来到了大数据时代。时代经历了一系列的变迁,技术也随之发展。因为CPU处理器的速度远大于硬盘,因此冯诺依曼系统中设计的计算机存储结构是多级缓存的结构,越靠近计算机的模块,要求处理的速度越快。因此,在磁盘时代中,数据库技术的性能瓶颈就是磁盘的I/O瓶颈。
最初的解决方案是在中间加一层高速cache(一般自带在cpu模块中,为三级缓存),这样可以对cpu的处理速度进行一级降级,不至于让cpu资源闲置。
但是高速缓存cache还是太快了,并且不可能全部将数据都放在电路中,需要在外置层级也放置一部分;因此就出现了下一级缓存——内存,对于处理的资源再次来了一次速度的降级。但是每次切换任务时磁盘还是会阻塞并且内存的速度还是远大于硬盘,这样IO还是会经常处于阻塞的状态。
为了解决这个问题,解决方案是在内存与硬盘中设置一层速度降级的缓存区buffer。处理的单个数据先不提交给内存,而是放到buffer中后面一起提交。当填满标准 I/O 缓存后才进行实际 I/O 操作,称之为全缓冲,比如文件的读写;当在输入和输出中遇到换行符时,执行真正的 I/O 操作,称之为行缓冲,比如键盘的输入输出;不进行缓冲,标准出错情况 stderr 是典型代表,称之为无缓冲,这使得出错信息可以直接尽快地显示出来。
但是缓冲区(buffer)也是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据。buffer解决的是数据"写"的速度问题,cache解决的是“读”的问题;具体参考非阻塞IO与DMA相关知识。
磁盘也有cache,硬盘的cache作用就类似于CPU的cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取,可以通过硬盘cache解决常驻内存访问问题。同时,由于机器的内存大小有限(费用与机器配置的原因内存小,但内存具有较为重要的战略地位),出现了一种叫做虚拟内存的技术作为内存的互补,使用虚拟内存地址、页表、地址翻译与内存映射技术将某一部分硬盘做成内存的映射区,也就是逻辑内存。屏蔽了内存与硬盘之间的差异性,具体技术参考Linux的mmap() 函数实现。在