- 热点key的问题如何解决?一旦发生热点key的情况,很有可能产生量倾斜,这就会导致,特定的几台机器压力特别大,甚至导致redis宕机,引发缓存雪崩,巨额流量涌入关系型数据库,就有可能导致核心链路发生故障。
-
检查热点SKU名单,将对于热点请求的数据进行,一主多从+哨兵的redis集群架构,有多个从主机负责处理读请求。
-
在redisCluster集群架构下,
利用flink,storm等的实时计算技术,对这SKU进行热点感知
,只要是热点品就将数据同步给多台master,并改变lua脚本的执行请求路由的策略。
-
升级redis单机硬件
。 -
采用多级缓存策略
即每台服务器上,设置一个访问计数器,每隔一段时间将累加器里的数据和redis中的数值相加并将相加后的值刷入本地缓存,那么每次用户读请求过来就是读每台机器上的本地缓存了,这样做的坏处是关于热点SKU的一些数据展示给用户的信息,都不是实时的。
==============================================================================
市面上常见的硬盘有:
-
机械硬盘(Hard Disk Drive,HDD)
-
固态硬盘(Solid State Drive,SSD)
本次主要向大家讲解机械硬盘的相关知识,机械硬盘的大致结构如下图↓:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBFRL6bO-1621169866268)(http://qskpmm1b6.hn-bkt.clouddn.com/20210516200206.png)]
可以看到,一个磁盘最主要的是由多个盘片组成,且每个盘片又由两个盘面组成,每个盘面上都有一个读写磁头
下面近距离地看看盘片的构成,如下图↓所示:
这东西是不是有点像过去使用的蚊香片呢?那一层层的灰色圆环被称为磁道,磁道上的那个绿色弧段部分,被称为扇区,从硬件层面来说,扇区是我们读写文件的最小单位,一般扇区的大小是512字节,也有4096字节的,但是在系统层面是以一个磁盘块为最小的读写单位,一般一个磁盘块大小为4096字节,如果是512字节的扇区磁盘,那么一个磁盘块,就是由8个连续的扇区组成。
决定磁盘Io速度的一些主要因素:
-
寻道时间
: 将读写磁头移动至正确的磁道上所需要的时间,这部分是IO读写效率的最核心因素,我们开发时最应该掌控的也应该是这一块内容了,所谓的磁盘顺序读写就是极大的减少了磁头所要移动的磁道数量,磁盘的平均寻道时间一般在3-15ms,一般都在10ms左右。 -
旋转延迟时间
: 盘片将目标扇区移动到读写磁头下方所需要的时间,取决于磁盘的运转速度。 -
数据传输时间
:完成传输数据所需要的时间。
其中后两个因素我们平时不需要去关注,第一点尤为关键。
我们如果自己开发中间件系统的话,就要去多多考虑这种因素。
为了增强mysql数据查询效率就会根据不同的业务建立不同的索引
如图↓:
假设要搜索元素14就只能把这个链上的数据都给遍历一遍也就是O(N)的时间复杂度,而且我们在做一个假设,就是你遍历一个节点都要在磁盘上读取,如果现在有几百万条数据,怎么玩的话你想想是一个什么样的结果
那么如果把它变为二叉树会怎么样呢?如图↓:
可以看到如果用二叉树的数据结构将这些节点组织起来,基本上可以天然的过滤掉一半的数据
读写就能定位到,我们要的数据了。
看上去好像挺不错的,但是如果发生下图↓一类的情况呢?
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
15289)]
[外链图片转存中…(img-eGyntcuN-1710782915289)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-xeQzDZhU-1710782915290)]