【Redis】为什么通常说Redis是单线程的?并且Redis为什么这么快!

  • 多线程有什么好处呢?使用多线程它不香么?
对于单纯的网络IO来说,当请求量达到一定程度之后,多线程的确会有很大的优势,

不过并不是单纯的多线程,而是每个线程都有自己的多路复用模型(如:select、poll、epoll)

也就是多线程和多路复用模型混合。
  • 那Redis为什么是单线程的呢?(这里指Redis4.0版本之前)
但是我们还要考虑Redis操作的对象,毕竟Redis是直接操作内存中的数据结构,

如果是多线程操作的话,那就需要为这些对象加锁。虽然多线程的效率提高,但是每个线程的程序效率严重下降,

并且程序逻辑也会更复杂。

敲黑板!!!此处需要墙裂补充一下:

1》我们一直强调的单线程,只是在处理网络请求的时候只有一个线程来处理,

一个正式的Redis-Server运行的时候肯定不止一个单线程,例如在Redis进行持久化的时候,

以子进程或子线程的方式进行。



2》Redis在4.0版本后开始会支持多线程的操作,所以本文仅适合Redis4.0版本前。

我们用【strace】指令获取一下启动后的线程情况:

[root@bogon data]# strace -ff -o /root/data/redis-thread-group/ooxx systemctl start redis

可以看到一共有6个线程情况,足以说明redis-server内部处理时非单线程

  • 那Redis为什么这么快呢?

1》Redis完全基于内存,大部分请求是纯内存操作,非常快速。

数据在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都为O(1);

2》采用单线程,减少了线程上线文切换和资源竞争,从而也就减少了对CPU性能上的开销。

也不存在加锁和释放锁操作,从而也减少了各种锁机制的性能消耗。

3》网络请求上使用多路I/O复用模型,即一种非阻塞I/O。

此处【多路】指的是多个网络连接,【复用】指的是复用同一个线程。

采用多路I/O复用技术,可以让单个线程更高效的处理多个连接请求,

从而减少网络I/O时间上的消耗。

4》数据结构简单,对数据操作也简单。

Redis中的数据结构是单独设计的。

原文地址:https://www.cnblogs.com/boluopabo/p/13042834.html