聊聊存储,redis为什么会快?

 


在生活中,我们要存储一些东西,会怎么做,比如我就给你8个箱子作为存储介质,

你是不是会依次把东西放进每个箱子,假如每个箱子只能存2个物件。

如上图,所有物件都存储完毕了。下面要你找出10的物件,你会怎么做?

是不是需要选择箱子,一个一个翻开查找,直到找到10,理论上讲需要找:1~2*8次。这就是遍历查找。

 

东西是存好了,但是查询效率太低了,那怎么提高呢。

如上图。如果我们把箱子分为两组,分别对应index=0,index=1,然后每次放物件,都将物件进行hash运算,并且和2取余,然后放到相应的位置的箱子中,查找的时候,先对查找条件进行hash然后和2取余,得到是哪一组的箱子。然后再遍历查找,这样讲查找此时为:1~2*4次。提升了查找速度。这也是我们常常说说的分而治之的思想。


做了上面的铺垫。再来看看我的存储。

第一阶段,我们的数据是存在文件之中的,通过io去写,然后再通过io去读,去查找数据。这种存在什么问题,其实这个就是对应着本文开头讲的,遍历查找问题,也就是全量io,效率十分低下。

第二阶段,我们的数据可以存进数据库来提高效率,数据库的数据是存在硬盘上的,那么为什么数据库要快一些。因为数据库给我们的数据存储进行了归类优化,例如数据库中会有表的概念,其实这就是一个分类,然后每张表,都会有索引,索引是什么?其实索引就是一种有规则的数据结构,能够帮助我们通过查询条件很快的查找到相应的数据,你也可以理解为我上面说的hash然后取余的过程,其实就是帮我快速定位数据位置,然后再io输出。

第三阶段,从第一和第二来看,你会发现一个问题,就是数据的存储和查找都是基于硬盘而来的,先说一个常识,硬盘的查找速度是在毫秒级别,而内存的查找速度是在纳秒级别,秒》毫秒》微妙》纳秒,也就是相差1000*1000=百万倍。所以如果我们可以把数据存进内存,那么就可以大大提高了我们的查询速度。这也是我们redis作为缓存速度快的一个重要原因,但是redis快除了这个原因,还有一个原因就是redis是单线程处理计算动作,并且采用的io多路复用机制。


中间穿插着说一下redis为什么快的原因吧,首先快,肯定是要有个比较对象,要么怎么说快,这里我们就拿数据来比吧,

1.内存快于硬盘

2.

举一个特殊的例子,连个client并发访问,两个server并行业务处理,对DB进行读写操作,如果要保证数据正确,该怎么操作?

如上图,必然是要有这个过程的,拿锁,开始事务,计算,关闭事务,释放锁,然后第二个server接着处理。那么看看早期的redis是怎么做的。

因为是单线程串行化处理,所以就不存在拿锁,释放锁,开启事务,关闭事务这几个动作了,自然会快,当然这是早期的思想,其实上面还可以优化,也就是现在redis的处理机制。(一个常识,单核处理器,同一时刻只能处理一个线程,但是如果是多核,那么同一时刻是可以处理多个线程)

如上图,多线程进行读写的操作,然后单线程进行计算的动作,这样可以大大减少总的处理时间。


上面说到第三阶段,可以基于内存做redis非关系数据库来进行提高查询速度,但是这个有一个致命的缺点就是,内存大小有限,并且内存相较于硬盘要贵很多。所以一般我们只是用缓存存储一些高频访问数据,那么如果出现了大量的热点数据怎么办?

这个时候HBase分布式存储就可以派上用场了。它是基于HDFS然后面向region和列族的数据库。(这里后面再具体写,因为自己暂时也不太熟悉,哈哈,后续补充把)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值