为什么redis是单线程?这里的单线程指什么?为什么这么快?
- Redis是不是单线程?
我们通过gdb调试Redis源码,查看线程:
上图中我们发现,Redis服务器内部有5个线程(在其它版本的Redis可能还会有io_xxx线程,主要用来进行命令的解码和编码的),并不是单线程。
其实Redis服务器主要的工作是处理命令,所以Redis说的单线程指的是处理客户端的命令是单线程的。
- 为什么不使用多线程?
- Redis服务器并不是一个IO密集型和CPU密集型,因为是内存数据库。
- 如果采用多线程:
- 加锁会很复杂,并且锁的密度不好控制。因为支持多个数据对象类型,而每个对象类型在不同条件下会采用不同数据结构实现。比如:list可以由quicklist或ziplist实现,hash可以由ziplist或者dict来实现等。
- 一个服务器可能连接多个客户端,有的客户端可能请求很频繁。使用多线程,可能会导致CPU中频繁的进行线程切换,导致效率下降。
- 使用单线程的缺点
不能有耗时操作,体现在响应性能。比如现在有多个客户端连接一个Redis服务器。当一个客户端发送请求给服务器时,如果响应很慢,第二个客户端发送请求给服务器,必须等上一个请求处理完才被处理。
- 为什么这么快?
- 采用了什么机制
- 由于Redis是内存数据库,不需要进行IO,效率高。
- 数据结构高效。
- 采用高效的reactor模型。即使用IO多路复用(检测事件是否就绪)。非阻塞IO(针对于read和write函数,只有在可以写和读的时候才会进行写和读)。
- 进行了什么优化
- 耗时阻塞操作,另外起线程处理。比如上面的:异步关闭大文件,异步释放大块内存,异步aof刷新到磁盘,异步请求和响应的加密解密,异步分配内存。
- 对象类型在不同条件下,使用不同数据类型来实现,主要是为了提高效率。
- 分治思想。将阻塞的操作。进行拆分,拆分成小的非阻塞操作。比如:dict的rehash。