1. 为什么 Redis 使用单线程?
因为Redis本身处理请求非常快,快到多线程带来的调度开销(线程切换、锁竞争)反而成了负担。
多线程确实能提高并发能力,但前提是:每个请求的处理比较耗时(相对于线程切换),比如访问磁盘,请求外部接口等等,而Redis的大多数命令是微秒级的,不值得使用多线程增加复杂度。
2,Redis为什么快?
-
内存级操作:没有磁盘 IO 的开销。
-
IO 多路复用机制(epoll)加持:可以同时监听大量连接,快速响应请求。
3,什么是epoll,它为什么高效?
epoll 是 Linux 内核提供的一种事件驱动的 IO 多路复用方式。
和老式的 select、poll 不同,epoll 不需要遍历所有连接状态,而是由内核直接通知你“哪个连接就绪了”,性能大大提升。
4,Redis的瓶颈在哪?
虽然Redis处理命令很快,但在高并发的场景下,网络IO的数据搬运过程(读写socket)就变成了瓶颈,这里涉及了用户态 <-> 内核态的数据拷贝,成了Redis的性能短板。
5,为什么Redis 6开始使用多线程?
从Redis 6开始,为了突破IO传输的瓶颈,引入了“IO 多线程”机制。具体说,读取客户端数据,发送响应这些网络IO操作可以交给多线程去做,但是核心命令部分,仍然是单线程,这样既提高了网络IO的吞吐能力,又提高了CPU的利用率,还避免了线程并发带来的复杂性。
比喻版:Redis办事大厅
- 门口是接待员epoll,负责通知谁来了,速度极快。
- 办公室里有个极其出色的业务员Redis主线程,处理业务的速度也是极快。
- 但是资料从前台送到办公室,从办公室送出去的速度跟不上了,Redis5之前只有一个送件员。
所以Redis 6开始启用了多个送件员,效率明显提升。