长篇大论就不必了,在这只看精华部分!此文部分来自转载,写此文目的就是让这两个问题一块得到分析总结。
为什么redis是单线程的?
redis的核心就是:如果我的数据全都在内存里,单线程的去操作就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis用单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。
其次说明一点,所谓的单线程是指在处理网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的。
什么时候用多线程的方案?
下层的存储等慢速的情况。比如磁盘。磁盘的特性:IPOS(Input/Output Operations Per Second,每秒的输入输出量)很低很低,但吞吐量很高。这就意味着,大量的读写操作都必须攒到一起,再提交到磁盘的时候,性能最高。所以对于磁盘来说,它吞吐量这么大,那最好的方案肯定是我将N个请求一起放在一个buff里,然后一起去提交。方法就是用异步:将请求和处理的线程不绑定,请求的线程将请求放在一个buff里,然后等buff快满了,处理的线程再去处理这个buff。然后由这个buff 统一的去写入磁盘,或者读磁盘,这样效率就是最高。
单线程的Redis为什么快?
1,纯内存操作
2,合理高效的数据结构
3,单线程操作,避免了频繁的上下文切换
4,采用了非阻塞I/O多路复用机制