赞
踩
大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。
本文已收录到我的技术网站:https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经
Redis 的线程模型其实是分两块的:
所以,你的回答要涉及这两个方面。
Redis 的单线程是指Redis 在执行一次命令时是单线程的。Redis 客户端与服务端的模型可以简化如下图:
步骤2 执行命令为单线程,其过程包括「接收客户端请求 -> 解析请求 ->数据读写等操作->返回结果给客户端」,这个过程是由一个主线程来完成的,这也是我们常说 Redis 是单线程的原因。
从 Redis 的内部设计来说,Redis 是基于 Reactor 模式开发了自己的网络事件处理器,这个处理器称之为文件事件处理器,而这个文件事件处理器是单线程的,这就决定了 Redis 是单线程的。文件事件处理器包含 5 个部分:
多个 socket 会产生不同的操作,每个操作对应一个不同的文件事件, IO 多路复用程序会监听多个 socket,将产生的事件放入到任务队列中排队,文件事件分派器每次从任务队列中获取一个事件,将其转发给对应的事件处理器进行处理。如下:
客户端与 Redis 服务端建立连接的过程
AE_READABLE
事件与连接应答处理器关联。AE_READABLE
事件,IO 多路复用程序监听到该事件后将 socket信息压入到任务队列中。AE_READABLE
是与连接应答处理器关联,所以就由连接应答处理器来处理该事件。AE_READABLE
事件与命令请求处理器关联。客户端发送请求给 Redis 服务端过程
set key value
)给服务端,首先会在对应的 Socket(socket1)上面产生一个 AE_READABLE
事件,IO 多路复用程序监听到该事件后将 socket信息压入到任务队列中。AE_READABLE
事件已经与命令请求处理器关联了,所以文件事件分派器将命令请求处理器。AE_WRITABLE
事件与命令回复处理器关联。AE_WRITABLE
事件与命令回复处理器关联,所以由命令回复处理器处理,命令回复处理器将准备好的相应数据写入socket01(socket连接是双向的),返回给客户端,之后解除 socket01 的 AE_WRITABLE
事件与命令回复处理器的关联。我们 Redis 是基于内存操作,内存的响应时长大约为 100 纳秒,单线程的 Redis 处理数据的极限是 80,000 到 100,000 QPS,对于绝大多数的场景来说,单线程的 Redis 其实是已经够用了。
但是,随着底层网络硬件越来越好,Redis 的性能瓶颈逐渐体现在 I/O 的读写上(CPU 从来都不是 Redis 的性能瓶颈),单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。所以,为了提高 Redis 的整体性能,在 6.0 引入多线程,注意,引入的多线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。
Redis 6.0 引入 I/O 多线程模型后,将一个命令的执行分为了两部分:
主要流程如下:
如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。