Redis到底是单线程还是多线程?
如果是Redis的业务处理部分(命令处理),就是 单线程 。但是如果是整个Redis内部的,那么就是 多线程 的。
在Redis v4.0的时候,引入多线程来处理一些耗时较长的任务,例如异步删除命令unlink。在Redis v6.0的时候,在核心网络模型中引入了多线程,进一步提高了对于多核CPU的利用。
那么为什么Redis要选择单线程呢?
除了持久化,Redis是纯内存操作,每个命令操作速度都是非常快的,所以它的性能瓶颈就不是执行速度,而是 网络延迟,多线程并不会带来性能提升。反而可能会因为线程上下文切换以及线程锁的引入导致性能下降。
Redis是通过IO多路复用来提高网络性能的,并且支持各种不同的多路复用实现,这些实现都做了封装,可以统一调用。
Redis使用NIO来进行客户端和服务端的网络通信。优先使用linux中的epoll机制来实现NIO,首先使用epoll_create在内核中创建epoll实例,epoll实例使用红黑树保存监听着的fd,然后使用一个链表来保存就绪的fd。然后创建server Socket的fd,使用epoll_ctl将它放入epoll实例的监听队列中,然后使用epoll_wait来等待fd的就绪。如果有客户端请求建立连接,fd就会就绪,然后进行连接的创立,为和这个客户端的连接创建另外一个fd放进监听队列中,监听它的读请求,如果有该客户端有命令过来,那么就会再监听这个fd的写请求,去执行命令后将结果再写回这个客户端。
多线程在哪?
无论是执行命令,还是建立监听,创建fd等操作,都是非常快的。唯一很慢的操作就是读取客户端连接(socket)中的数据和向这个客户端连接中写入数据的时候,也就是 IO 操作的时候会很耗时,如果还是使用单个线程来处理这些IO操作,那么很有可能因为某些很耗时的IO操作,导致后续的一些命令迟迟得不到执行。所以对于从客户端socket读取数据和向客户端socket写入数据的操作我们可以使用多线程来执行这些操作加快性能。所以我们说 Redis不是单纯的单线程,也结合了多线程 。虽然说使用了 多线程,但是单次请求的响应时间并不会得到提升,而是系统整体的吞吐量会得到很大的提升。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。