- 多线程有什么好处呢?使用多线程它不香么?
对于单纯的网络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中的数据结构是单独设计的。