Redis是单线程还是多线程?
通常我们所说的Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。所以严格来说Redis并不是单线程的。
Redis为什么不用多线程处理每个命令呢?
想必大家都听过,多线程能提高系统吞吐率这个说法了,但是这个的前提是要有很好的系统设计,尤其是共享资源的并发访问控制问题,如果没有精心的设计,那么并行也会变成串行,而且,采用多线程开发一般会引入同步原语来保护共享资源的并发访问,这也会降低系统代码的易调试性和可维护性。为了避免这些问题,Redis 直接采用了单线程模式。
Redis的多路复用机制
Redis之所以这么快除了完全基于内存计算和高效的数据结构意外,还有一个重要的原因就是采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。
要想了解IO模型,首先我们要知道IO操作是基于什么来实现的,如果一个应用程序, 想对外提供服务, 一般都是通过建立套接字监听端口来实现, 也就是socket,IO多路复用是系统来实现的并不是Redis实现的,这个需要系统层面的支持。不要搞混哈,不过现在很多系统都实现了IO多路复用,可能只是不同的系统实现方式不同而已。
好,那下面我们先来搞一下基本的IO模型和它的阻塞点?
以 Get 请求为例,Redis为了处理一个GET请求