一,首先Redis为什么这么快?
1.基于内存,不会受到硬盘IO速度的限制
2.**单线程,避免了多线程切换导致的CPU消耗,也不用考虑锁的问题,**不存在加锁释放锁的操作,也不存在因死锁而导致的性能消耗;
3.使用多路I/O复用模型,非阻塞IO
多路I/O复用模型
是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里的多路指的是多个请求,复用指的是复用同一个线程,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。
二,Redis为什么是单线程?
因为 Redis 是基于内存的操作
,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存
的大小或者网络带宽
。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦)。
也就是说,因为单线程实现及维护的成本低,加上单线程的性能已经非常高,所以就没用多线程。
注意这里的单线程,只是在处理我们的网络请求时只有一个线程来处理,Redis Server在运行时肯定不止一个线程,比如在持久化时会以子线程的方式执行。
三,Redis的瓶颈
机器内存大小
因为redis的数据放在内存里,所以存放数据量的多少取决于内存的多少
网络带宽
Redis客户端执行一条命令分为如下四个过程:
1)发送命令
2)命令排队
3)命令执行
4)返回结果
其中1)+4)称为Round Trip Time(RTT,往返时间)
评论区