ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
`Redis`为什么会选择使用单线程呢?这是因为`CPU`成为`Redis`瓶颈的情况并不常见,成为`Redis`瓶颈的通常是内存或网络带宽。例如,在一个普通的`Linux`系统上使用`pipelining`命令,`Redis`可以每秒完成`100`万个请求,所以如果我们的应用程序主要使用`O(N)`或`O(log(N))`复杂度的命令,它几乎不会使用太多的`CPU`。 那么既然`CPU`不会成为瓶颈,理所当然的就没必要去使用多线程来执行命令,这里需要明确的一个问题就是:多线程一定会比单线程快吗?答案是不一定。因为多线程也是有代价的,最直接的两个代价就是线程的创建和销毁(当然可以通过线程池来一定程度减少频繁的创建线程和销毁线程)以及线程的上下文切换。 在我们的日常系统中,主要可以区分为两种:`CPU`密集型 和`IO`密集型: 1. `CPU`密集型:这种系统就说明`CPU`的利用率很高,那么使用多线程反而会增加上下文切换而带来额外的开销,所以使用多线程效率可能会不升反降。 举个例子:假如你现在在干活,你一直不停的在做一件事,需要`1`分钟可以做完,但是你中途总是被人打断,需要花`1`秒钟时间步行到旁边去做另一件事,假如这件事也需要`1`分钟,那么你因为反复切换做两件事,每切换一次就要花`1`秒钟,最后做完这`2`件事的时间肯定大于`2`分钟(取决于中途切换的次数),但是如果中途不被打断,你做完一件事再去做另一件事,那么你最多只需要切换`1`次,也就是`2`分`1`秒就能做完。 2. `IO`密集型:`IO`操作也可以分为磁盘`IO`和网络`IO`等操作。大部分`IO`操作的特点是比较耗时且`CPU`利用率不高,所以`Redis 6.0`版本网络`IO`会改进为多线程。至于磁盘`IO`,因为`Redis`中的数据都存储在内存(也可以持久化),所以并不会过多的涉及到磁盘操作。 举个例子:假如你现在给树苗浇水,你每浇完一次水之后就需要等别人给你加水之后你才能继续浇,那么假如这个等待过程需要`5`秒钟,也就是说你浇完一次水就可以休息`5`秒钟,而你切换去做另一件事来回只需要`2`秒,那么你完全可以先去做另一件事,做完之后再回来继续浇水,这样就可以充分利用你空闲的`5`秒钟时间,从而提升了效率。 使用多线程还会带来一个问题就是数据的安全性,所以多线程编程都会涉及到锁竞争,由此也会带来额外的开销。