面试官:说下Redis为什么速度快?

121 阅读3分钟

提纲挈领

一、基于内存的实现

二、恰当而合适的数据结构

三、合理的数据编码

四、设计优秀的线路模型

五、更加快捷的底层通道

以上四点希望能有个大致的印象,面试的时候往往会容易简单而记不起全部的内容,但是心里有个数,有记忆深刻的点往往会唤醒更多的埋藏在脑中的知识点,至少达到不会磕磕巴巴的效果。

以下将进行扩展来说:

一、基于内存的实现

为什么说基于内存的实现会快?从这个角度来思考的话,内存是比什么快呢?没错,往往能想起来的就是磁盘IO,如果不深挖的话,内存往往是比磁盘IO的速度快的。但是如果有兴趣的朋友,可以去思考下,为什么内存比IO快?内存就一定比IO快吗?

但是面对面试,这点往往是最好回答的一点,面试官一般也不会往这方面深挖,因此只需要回答出来Redis是完全基于内存实现

二、恰当而合适的数据结构

Redis的的五种数据结构:

1.String字符串

2.Hash

3.链表

4.Set 集合

5.zset 有序集合

Redis五种数据结构详解

这五种数据结构简单而朴实无华,就是为了优化速度而被设计出来的。 主要目的就是为了适应不同场景的存储需求以及减少数据存储的时间复杂度

三、合理的数据编码

String:存储数字的话,采用int类型的编码,如果是非数字的话,采用 raw 编码;

List:字符串长度及元素个数小于一定范围使用 ziplist 编码,任意条件不满足,则转化为 linkedlist 编码;

Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;

Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码;

Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码。

四、设计优秀的线路模型

1.采用单线程,复杂的问题简单化往往能追求到更高效率,完全避免了线程之间的切换,省去了尔虞我诈的争夺资源,也不必要考虑数据安全的问题,不需要操纵锁等影响效率的工具,达到了性能的优秀使用率。

2.I/O 多路复用模型同时监听客户端连接,简单的理解来说就是哪壶不开烧哪壶的木柴,简单来说就是当前线程没事干了,都冷静下来了,这个时候去唤醒它,让该线程开始运作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

五、更加快捷的底层通道

使用的底部模型采用的是更适合于数据交互的模型,他们之间的实现方法及通信应用协议不同,Redis给自身开了一条捷径,即VM机制,普通的系统进行调用函数的时候,会浪费一点的时间及性能去请求。

结语

对于面试而言,我个人认为以上几点就足够回答面试官的问题了。还想深入的朋友可以点击以下链接继续学习。

mp.weixin.qq.com/s/0R0Evh1QX…