Redis单线程
1、单线程Redis为什么这么快?
- 单线程实现:避免了多线程编程模式面临的共享资源的并发访问控制问题,比如线程切换和锁资源争用的开销。
- 内存存储:Redis是使用内存存储,没有磁盘IO上的开销。
- 高效的数据结构: 采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。
- 采用多路复用机制:使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。
2、基于多路复用的高性能I/O模型
多路复用机制是指一个线程处理多个IO流,就是我们经常听到的select/epoll机制。简单来说,在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给Redis线程处理,这就实现了一个Redis线程处理多个IO流的效果。
Redis网络框架调用epoll机制,让内核监听这些套接字。此时,Redis线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。正因为此,Redis可以同时和多个客户端连接并处理请求,从而提升并发性。
为了在请求到达时能通知到Redis线程,select/epoll提供了基于事件的回调机制,即针对不同事件的发生, 调用相应的处理函数。
具体过程如下:
- Redis网络框架调用epoll机制,让内核监听这些套接字。
- select/epoll一旦监测到FD(套接字)上有请求到达时,就会触发相应的事件。
- 这些事件会被放进一个事件队列,Redis单线程对该事件队列不断进行处理。
总结:
这样一来,Redis无需一直轮询是否有请求事件发生,这就可以避免造成CPU资源浪费。同时,Redis在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为Redis一直在对事件队列进行处理,所以能及时响应客户端请求,提升Redis的响应性能。
3、Redis为啥被称为单线程?
- Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。
- 但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。所以,严格来说,Redis并不是单线程,但是我们一般把Redis称为单线程高性能,这样显得“酷”些。
4、Redis6.0为什么引入多线程?
- Redis主要瓶颈在于内存与网络IO,内存不够可以增加或提供数据结构优化,而网络lO读写占时间,若可以将网络处理改为多线程,性能将大幅度提高。
- 引入多线程处理网络读写,执行命令还是单线程,充分利用服务器多核资源。