其他网址
【Redis】为什么Redis单线程却能支撑高并发?Redis6.0之后为什么又引入多线程?_-CSDN博客
为什么单线程的Redis却能支撑高并发 - 一中晴哥威武 - 博客园
redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? - 简书
《Redis开发与运维》=> 1.2 Redis特性=> 1. 速度快
Redis为什么速度很快
- 数据存放在内存中
- 内存的读写速度是磁盘(数据库)的一百倍左右。
- 用C语言实现
- C语言更底层, 执行速度相对会更快。
- 单线程架构
- 预防了多线程可能产生的竞争问题。
- 作者对代码的精打细磨
- 曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。
Redis单线程的优缺点
单进程单线程优势
- 没有多线程竞争锁的性能消耗。
- 没有多线程导致的切换而消耗CPU。
单进程单线程弊端
CPU不是Redis的瓶颈,无法发挥多核CPU性能。不过可以通过在单机开多个Redis实例来完善;
//Redis的瓶颈最有可能是机器内存的大小或者网络带宽
为什么单线程还这么快?
简介
原因如下
- 没有多线程竞争锁的性能消耗。
- 没有多线程导致的切换而消耗CPU。
- I/O多路复用(非阻塞I/O):Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间。
IO多路复用
简介
Redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。
多路:指的是多个socket连接,复用:指的是复用一个线程。采用多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)。
多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术,Redis使用的epoll(Netty也是用的这个)。
Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
- 多个 socket
- IO 多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
处理流程
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
来看客户端与 redis 的一次通信过程