【个人理解】redis 为什么比 文件 mysql 快(todo)

0
日常无数次听到,能用redis 就不用 mysql。 把无业务逻辑,简单业务逻辑统统的放到redis 中,反正redis 性能高。
redis 使用的是内存,比读取磁盘快多了。 至于为什么,倒说不出来为什么,只是默认这么一个常识。

1. 磁盘的读取方式

1.1 磁盘是个什么样?

关于磁盘的读取,详细的可以参考 硬盘的读写原理

下面说下我自己的理解,先通过二个图,看看 磁盘是什么?

clipboard.png

clipboard.png

1.2 磁盘是如何读取数据的?

发现自己的理解,还是不如文章中说明的更加清晰明确,就直接copy过来了。
  • 确认磁盘地址

    确定磁盘地址(柱面号,磁头号,扇区号),内存地址(源/目):
    

    当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址(MMU|TLS),
    即确定要读的数据在哪个磁道,哪个扇区。

  • 读取数据

    为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点:

  1) 寻道:首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,

  2) 旋转:然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下。这个过程耗费的时间叫做旋转时间。


即一次访盘请求(读/写)完成过程由三个动作组成:

  1. 寻道(时间):磁头移动定位到指定磁道 
  2. 旋转延迟(时间):等待指定扇区从磁头下旋转经过 
  3. 数据传输(时间):数据在磁盘与内存之间的实际传输

 
因此在磁盘上读取扇区数据(一块数据)所需时间:

   Ti/o=tseek +tla + n *twm

其中:tseek 为寻道时间,tla为旋转时间,twm 为传输时间

虽然可以很好的利用页读,和局部性的特性。 但是在磁盘上通过转针读取文件内容,还是非常慢的。

2. 内存的读取方式

2.1 看下内存是个什么样?

clipboard.png

clipboard.png

内存的结构

clipboard.png

clipboard.png

2.2 内存的读写原理(行地址+列地址)

内存地址

内存中的cell按矩阵形排列,每一行和每一列都会有一个对应的行地址线路(正规叫法叫做word line)和列地址线路(正规叫法是bit line),每个具体的cell就挂接在这样的行地址线路和列地址线路上,对应一个唯一的行号和列号,把行号和列号组合在一起,就是内存的地址。

上图是Thaiphoon Burner的一个SPD dump,每个地址是一个字节。
不过我们可以把这些数据假设成只有一个bit,当成是一个简单的内存地址表,左边竖着的是行地址,上方横着的是列地址。例如我们要找第七行、倒数第二列(地址为7E)的数据,它就只有一个对应的值:FD。当然了,在内存的cell中,它只能是0或者1。

寻址

数据要写入内存的一个cell,或者从内存中的一个cell读取数据,首先要完成对这个cell的寻址。寻址的过程,首先是将需要操作的cell的对应行地址信号和列地址信号输入行/列地址缓冲器,然后先通过行解码器(Row Decoder)选择特定的行地址线路,以激活特定的行地址。每一条行地址线路会与多条列地址线路和cell相连接,为了侦测列地址线路上微弱的激活信号,还需要一个额外的感应放大器(Sense Amplifier)放大这个信号。当行激活之后,列地址缓冲器中的列地址信号通过列解码器(Column Decoder)确定列地址,并被对应的感应放大器通过连接IO线路,这样cell就被激活,并可供读写操作,寻址完成。从行地址激活,到找到列地址这段时间,就是tRCD。

参考 : 内存的工作原理

3. 内存和磁盘的对比

3.1 存储原理

硬盘的存储数据原理:
我们知道信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1(磁化为1),凹的地方代表数字0。因此硬盘可以以二进制来存储表示文字、图片等信息。

内存存储数据原理:
而内存的原理就完全不同,内存是晶体管制作的(CPU也是晶体管做的),而晶体管的特性就是我们平时常说的用开关的开和关来表示1,0.
通过一些门电路的组合可用来表示数字和实现复杂的逻辑功能.而内存主要是用来临时保存数据.CPU就是处理一些逻辑关系.

晶体管由于必须得通电,然后用电流的有无状态来表示信息,充放电后电荷的多少(电势高低)分别对应二进制数据0和1,所以只有通电的时候可以保存数据,电一断内存里的晶体管状态就处未知状态就啥用处也没了.而磁盘断电后磁性物质还会一直保持原样.

我们知道访问磁盘时就通过磁头去指到固定的地方然后读取数据.不过内存就不一样,不需要啥磁头去读取数据,它是有数据总线连接,我们是通过总线去读取内存的数据.

3.2 读取原理

从内存读取到磁盘预读
  由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:

  当一个数据被用到时,其附近的数据也通常会马上被使用。

  程序运行期间所需要的数据通常比较集中。

  由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。

  预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。


作者:阿征new
来源:CSDN
原文:https://blog.csdn.net/zhangho...
版权声明:本文为博主原创文章,转载请附上博文链接!

4. 更快的寄存器

参考阮一峰的文档 为什么寄存器比内存快?

引入其中的一部分解释
  1. 寄存器比起内存离CPU设计的更近,传输需要时间
  2. 寄存器位数比较少,因为比较简单。
  3. 工作方式比较简单,只有二步。

5. SSD

关于文件IO缓存的就不在此多说了,具体参考文件的读取

100. 致敬

参考链接 :

https://blog.csdn.net/hguisu/...

https://www.zhihu.com/questio...

https://www.cnblogs.com/huxia...

https://blog.csdn.net/zhangho...

todo

你可能感兴趣的

载入中...