1.redis快
redis作为一种常见的kv数据库,在实际中使用非常广泛,其最大的特点就是"快",在系统中常被用来当做缓存快速获取想要数据。我们也会经常被问到,redis为什么这么快呢?下面来进行一下小结。
2.基于内存的数据库
首先大家都知道的一点是,redis是基于内存的数据库。对比mysql等基于磁盘的数据库来说,需要先将数据从磁盘读入到内存,而这个过程受限于磁盘的I/O,速度肯定就快不起来。而对于基于内存的redis来说,数据直接存储在内存中,直接省略了从磁盘中读取这一步,速度自然就要"快"很多。
3.多路I/O复用模型(Multiplexing)
多路IO复用也是经常被提及的一个点。
常见的IO模型包括
同步阻塞IO(Blocking IO)
同步非阻塞IO(Non-blocking IO)
异步阻塞IO,即IO多路复用(IO Multiplexing),Reactor设计模式。
异步非阻塞IO(Asychronous IO)
Reactor模式称为反应器模式或应答者模式,是一种基于事件驱动的设计模式,其主要目的是为了处理并发服务请求。当客户端的请求抵达服务器以后,服务器会采用多路分配的策略,由一个线程接收所有请求,然后将请求派发到相关的工作线程并进行处理。
在redis中,IO多路复用的具体含义是可以如下简单理解
I/O:指网络I/O,或者说客户端的请求。
多路:指有多个TCP链接
复用:指共用一个线程或进程。
对于服务端接收到的大量请求,redis使用I/O多路复用程序同时监听多个套接字,并且将这些事件push到同一个队列中逐步执行,最终再将结果返回给客户端。
具体可以参考从网络中找打的如下一张图,对于理解redis的整体架构有比较大的帮助。
4.单线程模式
大家经常说,redis是单线程模式。关于这个单线程模式,需要特别注意理清楚。
平时大家所说的单线程模式,对应上面的图片,其实指的是执行redis命令的核心模块是单线程,并不是说整个redis的服务就只有一个线程。
可以参考下面的说法:
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
为什么redis会使用单线程?因为一般来说,redis比较少会有计算密集型的操作,所以cpu不会有瓶颈。redis的瓶颈,一般是在没存大小与网络IO。实际中我们为了使用cpu的多核,都是采用搭建多个redis实例来解决。
在redis6.0以后的新版本中,网络IO处理模块已经使用了多线程,比如网络数据的读写与协议解析等等。但是,执行命令的模块,即文件事件分派器仍然是单线程,所以我们还是可以说redis是单线程模型。
单线程模式可以使得redis变快,原因主要在于单线程在执行的过程中不需要进行上下文的切换,从而减少了耗时提高了处理速度。