写点什么

Day269

  • 2022 年 5 月 07 日
  • 本文字数:1860 字

    阅读完需:约 6 分钟

即每台服务器上,设置一个访问计数器,每隔一段时间将累加器里的数据和 redis 中的数值相加并将相加后的值刷入本地缓存,那么每次用户读请求过来就是读每台机器上的本地缓存了,这样做的坏处是关于热点 SKU 的一些数据展示给用户的信息,都不是实时的。




[](()二、瞬时高流量下,Mysql 查询缓慢原因


==============================================================================


[](()1、一些硬件知识




市面上常见的硬盘有:


  • 机械硬盘(Hard Disk Drive,HDD)

  • 固态硬盘(Solid State Drive,SSD)


本次主要向大家讲解机械硬盘的相关知识,机械硬盘的大致结构如下图↓:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBFRL6bO-1621169866268)(http://qskpmm1b6.hn-bkt.clouddn.com/20210516200206.png)]


可以看到,一个磁盘最主要的是由多个盘片组成,且每个盘片又由两个盘面组成,每个盘面上都有一个读写磁头




下面近距离地看看盘片的构成,如下图↓所示:



这东西是不是有点像过去使用的蚊香片呢?那一层层的灰色圆环被称为磁道,磁道上的那个绿色弧段部分,被称为扇区,从硬件层面来说,扇区是我们读写文件的最小单位,一般扇区的大小是 512 字节 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ,也有 4096 字节的,但是在系统层面是以一个磁盘块为最小的读写单位,一般一个磁盘块大小为 4096 字节,如果是 512 字节的扇区磁盘,那么一个磁盘块,就是由 8 个连续的扇区组成。




[](()2、磁盘 IO 操作的时间的影响因素




决定磁盘 Io 速度的一些主要因素:


  1. 寻道时间: 将读写磁头移动至正确的磁道上所需要的时间,这部分是 IO 读写效率的最核心因素,我们开发时最应该掌控的也应该是这一块内容了,所谓的磁盘顺序读写就是极大的减少了磁头所要移动的磁道数量,磁盘的平均寻道时间一般在 3-15ms,一般都在 10ms 左右。

  2. 旋转延迟时间: 盘片将目标扇区移动到读写磁头下方所需要的时间,取决于磁盘的运转速度。

  3. 数据传输时间:完成传输数据所需要的时间。


其中后两个因素我们平时不需要去关注,第一点尤为关键。


我们如果自己开发中间件系统的话,就要去多多考虑这种因素。




[](()3、Innodb 存储引擎的索引树结构




为了增强 mysql 数据查询效率就会根据不同的业务建立不同的索引


如图↓:



假设要搜索元素 14 就只能把这个链上的数据都给遍历一遍也就是 O(N)的时间复杂度,而且我们在做一个假设,就是你遍历一个节点都要在磁盘上读取,如果现在有几百万条数据,怎么玩的话你想想是一个什么样的结果




那么如果把它变为二叉树会怎么样呢?如图↓:



可以看到如果用二叉树的数据结构将这些节点组织起来,基本上可以天然的过滤掉一半的数据读写就能定位到,我们要的数据了。




看上去好像挺不错的,但是如果发生下图↓一类的情况呢?



假设现在要找值为 17 的元素,我们还是要进行 O(N)的时间复杂度的遍历,所以这种二叉树的高度有可能会很高,导致产生大量的读磁盘,而且每个节点里只有一个数据,也就是说我们现在要实现两点需求:


  • 降低树的高度,减少磁盘的读操作

  • 让每个节点拥有更多的数据,这样一次读磁盘可以获取更多数据,如果这些数据暂时用不到,也可以将它缓存起来,如果用到了直接从缓存中拿就可以了,避免过多的磁盘 IO。




数据融合 ,如下图↓所示:



↑上图可以看到 数据融合之后我们如果要找到 17 这个数据从根节点开始算只要经历 3 个节点就可以了。大大降低了读磁盘的次数。像↑上图那样的数据结构就是 B 树结构,常应用于文件系统。




现在再来做一个实验,在现有的数据结构中加入 18 和 19 两个数字,看看是什么效果 ,如图↓:



在加了两个结点之后,数据节点发生了分裂,而这些操作都是在磁盘中进行的,你想一下如果数百万条预约请求打过来,那么在那一瞬间,数据库频繁的发生这种数据块的分裂对 cpu 造成的负载可见一斑。


甚至不夸张的说都有宕机的风险,而且这种分裂是可以产生连锁反应的,也就是说当一个节点产生分裂那么就有可能导致它的父节点也跟着产生分裂,这种现象叫做上溢,因为 B 树必须严格遵守一个数据的排列规定,才能保证树的平衡。




[](()4、B 树的定义




就像上面的那颗 B 树被称为 4 阶 B 树,我们假设这个 B 树的阶为 X,每个数据节点的包含的元素个数为 J,那么这个 B 树,必须遵守如下约定:


  1. 根节点的元素数量 1<=J<=X-1

  2. 非根节点的元素数量 ceil((X-1)/2)<=J<=X-1

  3. 如果一个数据节点有子结点的话,那么该数据节点的子节点数量等于 J+1


由此可见虽然 B 树能够有效的减少磁盘的读写次数,但是维护数据的顺序排列也是需要很大的成本的,所以必须要根据数据库所涉及到的不同业务场景来建立索引树。

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Day269_Java_爱好编程进阶_InfoQ写作社区