Redis终究为什么这么快?
Redis为什么这么快?
- 彻底依据内存,数据存在内存中,绝大部分恳求是朴实的内存操作,十分快速,跟传统的磁盘文件数据存储比较,防止了经过磁盘IO读取到内存这部分的开支。
- 数据结构简略,对数据操作也简略。【Redis中的数据结构】是专门进行规划的,每种数据结构都有一种或多种数据结构来支撑。Redis正是依靠这些灵敏的数据结构,来提高读取和写入的功能。
- 选用单线程,省去了许多上下文切换的时刻以及CPU耗费,不存在竞赛条件,不用去考虑各种锁的问题,不存在加锁开释锁操作,也不会呈现死锁而导致的功能耗费。
- Redis直接自己构建了VM 机制 ,防止调用体系函数的时分,浪费时刻去移动和恳求
- Redis 选用了 I/O 多路复用机制处理很多的客户端 Socket 恳求,【IO 多路复用机制】是指一个线程处理多个 IO 流,便是咱们常常听到的 select/epoll 机制。简略来说,在 Redis 只运转单线程的情况下,该机制答应内核中,一起存在多个监听 Socket 和已衔接 Socket。内核会一向监听这些 Socket 上的衔接恳求或数据恳求。一旦有恳求抵达,就会交给 Redis 线程处理,这就完成了一个 Redis 线程处理多个 IO 流的作用。
Redis 依据 Reactor 形式开发了自己的网络事情处理器,这个处理器被称为文件事情处理器 file event handler。由于这个文件事情处理器是单线程的,所以Redis才叫做单线程的模型,可是它选用IO多路复用机制一起监听多个Socket,并依据Socket上的事情来挑选对应的事情处理器进行处理。文件事情处理器的结构包括4个部分,线程模型如下图:
多个 Socket 或许会发生不同的操作,每个操作对应不同的文件事情,可是IO多路复用程序会监听多个Socket,将Socket发生的事情放入行列中排队,事情分配器每次从行列中取出一个事情,把该事情交给对应的事情处理器进行处理。
Redis客户端对服务端的每次调用都阅历了发送指令,履行指令,回来成果三个进程。其间履行指令阶段,由于Redis是单线程来处理指令的,一切每一条抵达服务端的指令不会马上履行,一切的指令都会进入一个行列中,然后逐一被履行。并且多个客户端发送的指令的履行次序是不确认的。可是能够确认的是不会有两条指令被一起履行,不会发生并发问题,这便是Redis的单线程根本模型。
多路I/O复用模型是运用 select、poll、epoll 能够一起督查多个流的 I/O 事情的才能,在闲暇的时分,会把当时线程堵塞掉,当有一个或多个流有 I/O 事情时,就从堵塞态中唤醒,然后程序就会轮询一遍一切的流(epoll 是只轮询那些真实宣布了事情的流),并且顺次次序的处理安排妥当的流,这种做法就防止了很多的无用操作。
这儿“多路”指的是多个网络衔接,“复用”指的是复用同一个线程。选用多路 I/O 复用技能能够让单个线程高效的处理多个客户端的网络IO衔接恳求(尽量削减网络 IO 的时刻耗费)
为什么Redis是单线程?
这儿咱们着重的单线程,指的是网络恳求模块运用一个线程来处理,即一个线程处理一切网络恳求,其他模块仍用了多个线程。
那为什么运用单线程呢?官方答案是:由于CPU不是Redis的瓶颈,Redis的瓶颈最有或许是机器内存或许网络带宽。已然单线程简单完成,并且CPU不会成为瓶颈,那就水到渠成地选用单线程的计划了。
可是,咱们运用单线程的方法是无法发挥多核CPU 功能,不过咱们能够经过在单机开多个Redis 实例来处理这个问题
Redis6.0 的多线程
1、Redis6.0 之前为什么一向不运用多线程?
Redis运用单线程的可维护性高。多线程模型虽然在某些方面体现优异,可是它却引进了程序履行次序的不确认性,带来了并发读写的一系列问题,增加了体系复杂度、一起或许存在线程切换、乃至加锁解锁、死锁形成的功能损耗。
2、Redis6.0 为什么要引进多线程呢?
由于Redis的瓶颈不在内存,而是在网络I/O模块带来CPU的耗时,所以Redis6.0的多线程是用来处理网络I/O这部分,充分运用CPU资源,削减网络I/O堵塞带来的功能损耗。
多线程形式下,是否存在线程并发安全问题?
如图,一次redis恳求,要树立衔接,然后获取操作的指令,然后履行指令,最终将呼应的成果写到socket上。
在redis的多线程形式下,获取、解析指令,以及输出成果着两个进程,能够装备成多线程履行的,由于它毕竟是咱们定位到的首要耗时点,可是指令的履行,也便是内存操作,依然是单线程运转的。所以,Redis 的多线程部分仅仅用来处理网络数据的读写和协议解析,履行指令仍然是单线程次序履行,也就不存在并发安全问题。
面试题专栏
Java面试题专栏已上线,欢迎拜访。
- 假如你不知道简历怎样写,简历项目不知道怎样包装;
- 假如简历中有些内容你不知道该不该写上去;
- 假如有些归纳性问题你不知道怎样答;
那么能够私信我,我会尽我所能协助你。