為什么說 Redis 是單線程的?
我們常說的 Redis 是單線程的,但是我前面在講持久化機制的時候又說 RDB 的持久化是通過主進程 fork 出一個子進程來實現 RDB 持久化。那么 Redis 到底是多線程還是單線程的呢?
Redis 的網絡 IO 和鍵值的讀寫是單線程完成的。
但是在 Redis4.0 之后,Redis 引入了多線程模型,但是 IO 部分還是由單線程完成,而其他的如持久化存儲模塊、集群支撐模塊等是多線程的。(Redis 6.0 之后將網絡 IO 改為了多線程)
[!info]
前面我們講到的 RDB 持久化,以及 Redis 集群支撐都是基于多線程完成的
1、多線程的好處
多線程的好處在于能夠更大程度的利用 CPU 資源以及 IO 資源。
首先 Redis 是否需要提升 CPU 利用?
我們都知道 Redis 是基于內存的數據庫,CPU 的資源不是 Redis 的性能瓶頸
所以,通過多線程技術來提升 Redis 的 CPU 利用率這一點是完全沒必要的。
那么,使用多線程技術來提升 Redis 的 l/O 利用率呢?是不是有必要呢?
Redis 確實是一個 I/O 操作密集的框架,他的數據操作過程中,會有大量的網絡 I/O 和磁盤 I/O 的發生。要想提升 Redis 的性能,是一定要提升 Redis 的 I/O 利用率的,這一點毋膏置疑。
但是,提升 I/O 利用率,并不是只有采用多線程技術這一條路可以走。
Redis 基于 I/O 多路復用來提高 IO 利用率。
2、多線程的壞處
我們都知道 Java 針對并發安全做出了很多的方案。如內存模型、鎖、CAS 等,這些者都是 Java 中提供的一些在多線程情況下保證線程安全的技術。
和 Java 類似,所有支持多線程的編程語言或者框架,都不得不面對的一個問題,就是如何解決多線程編程模式帶來的共享資源的并發控制問題。
雖然,采用多線程可以幫助我們提升 CPU 和I/O 的利用率,但是多線程帶來的并發問題也給這些語言和框架帶來了更多的復雜性。而且,多線程模型中,多個線程的互相切換也會帶來一定的性能開銷。
所以,在提升I/O 利用率這個方法上,Rdis 并沒有采用多線程技術,而是選擇了多路復用 I/O 技術。
3、Redis 是否需要多線程?
6.0 之前沒使用多線程原因:
- Redis 是基于內存的, 執行速度非常快,CPU 資源不是瓶頸。
- 采用多線程,避免不必要的上下文切換,避免線程不安全的問題。
- 采用了 I/O 多路復用,非阻塞式 IO。
引入多線程的原因: - 隨著業務的越來越復雜,Redis 的網絡 IO 還是成為了最大的瓶頸。
- Redis 6.0 的多線程,只是在處理網絡 IO 處使用,在執行命令依然是單線程