redis不同版本线程模型特点
| |
|---|
| |
| 支持了部分多线程操作,主要是为了解决 3.x 的大key操作导致的超时性能问题 |
| |
Redis 3.x 单线程为什么这么快“基于内存操作,Redis的所有数据都在内存中,因此所有的运算都是内存级别的,性能高。 2. 数据结构简单,Redis的数据结构是为自身专门量身打造的,而这些数据结构的查找和操作的时间复杂度都是 O(1)。 3. 多路复用和非阻塞I/O,Redis使用I/O多路复用功能来监听多个socket连接客户端,这样就可以使用一个线程来处理多个情况,从而减少线程切换带来的开销,同时也避免了I/O阻塞操作,从而提高了Redis的性能 4. 避免上下文切换,单线程模型避免了不必要的上下文切换和多线程竞争,避免多线程切换带来的时间和性能上的开销,而且单线程不会线程互斥等待的问题。

单线程性能这么高,为什么要引入多线程?Redis中的写入和读取速度非常快,并且CPU使用率从来不是Redis关心的问题。 根据Redis官方文档,在普通Linux系统上运行时,Redis每秒最多可以处理100万个请求。但是现在的tps限制在10W,问题在哪?网络IO限制瓶颈来源于网络I/O, 即使在网络连接中采用了IO多路复用的epoll机制, Redis中的处理时间大部分浪费在等待网络I/O上。 虽然多线程架构允许应用程序通过上下文切换并发处理任务,但这对Redis的性能增益很小,因为大多数线程最终会在I/O中被阻塞。

在6.0之前,Redis性能很高,但是如果想继续提升吞吐量,瓶颈不是CUP而是网络IO,简单一点说,网络IO是请求入口,如果入口一直就这么大,后面的命令执行再快,也没有办法,所以在6.0新增了网络IO多线程,扩大流量入口。Redis6的线程模型在Redis6中,引入多线程处理网络IO,注意是多线程处理网络IO,模型如下

在Redis 6中引入了多线程进行IO读取响应操作。单线程和多线程的性能对比


从图中可以看到多线程IO比单线程性能高了近2倍。
上一条:Redis缓存一致性问题
下一条:Redis优化性能