redis是基于内存的,内存的读写速度非常快
redis是单线程的,省去了很多上下文切换线程的时间
- 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
- 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求
-
Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
-
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的上下文切换而消耗 CPU
redis使用IO多路复用技术
- Redis使用的是非阻塞IO
- redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量
- 这里“多路”指的是多个网络socket连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量
单进程单线程优势
- 代码更清晰,处理逻辑更简单
- 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
- 不存在多进程或者多线程导致的切换而消耗CPU
单进程单线程弊端
- 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
为什么Redis 6.0引入了多线程
Redis 6.0中的多线程,也只是针对处理网络请求过程采用了多线程,而数据的读写命令,仍然是单线程处理的。
不是说多路复用技术已经大大的提升了I0利用率了么,为啥还需要多线程?
而经过分析,限制Redis的性能的主要瓶颈出现在网络I0的处理上,虽然之前采用了多路复用技术。但是我们前面 也提到过,多路复用的I0模型本质上仍然是同步阻塞型I0模型。
如果能采用多线程,使得网络处理的请求并发进行,就可以大大的提升性能。多线程除了可以减少由于网络 I/0等待造成的影响,还可以充分利用 CPU 的多核优势。
所以,Redis 6.0采用多个I0线程来处理网络请求,网络请求的解析可以由其他线程完成,然后把解析后的请求交由主线程进行实际的内存读写。提升网络请求处理的并行度,进而提升整体性能。
总之:Redis 的多I/O线程只是用来处理网络请求的,对于读写命令,Redis 仍然使用单线程来处理