美文网首页转载部分
为什么单线程的 Redis 性能那么高?带你走近 Redis 线

为什么单线程的 Redis 性能那么高?带你走近 Redis 线

作者: 爱打乒乓的程序员 | 来源:发表于2019-12-12 18:21 被阅读0次

聊 Redis 线程模型之前,先思考一个问题:Redis 是单线程的,但为什么可以支持高并发?

这问题的答案我认为可以从以下几个点回答:

1.纯内存操作——内存操作肯定比普通的操作快呀!
2.非阻塞 IO 多路复用程序—— Redis 核心
3.单线程避免上下文切换带来的CPU消耗

其中第二点,Redis 核心是非阻塞 IO 多路复用程序,这是什么东东?

那就要引入这篇文章的主角———— Redis 线程模型

简介:

Redis 线程模型实际上是 Redis 基于 Reactor 模式开发的文件事件处理器(File Event Handler)。简单来说,文件事件处理器可以监听多个客户端的 socket,并根据 socket 产生的事件选择不同的事件处理器处理客户端连接请求、命令请求和响应请求。

文件事件处理器的组成:

多个 Socket: Redis 服务器会为每个发起连接 Redis 的客户端创建对应的 Socket
IO 多路复用程序: 可以同时监听多个 socket,当 Socket 产生事件,IO多路复用程序会将 Socket 塞进队列。
文件事件分派器: 接收队列的 Socket 并分派到 Socket 事件关联的事件处理器。
事件处理器: 包括连接应答处理器、命令请求处理器、命令回复处理器、复制处理器。

连接应答处理器:对连接服务器的客户端进行应答。
命令请求处理器:接收客户端发过来的请求。
命令回复处理器:向客户端返回命令的执行结果。
复制处理器:当从服务器向主服务器进行复制的操作时,主从服务器都需要关联复制处理器。

文件事件处理器可以接收多个客户端的发过来的请求信息,请求信息会产生相应的事件(譬如:AE_READABLEAE_WRITEABLE),然后非阻塞 IO 多路复用程序监听到 socket 产生的事件就会把 socket 塞进队列,再通过文件事件分派器选择事件对应的处理器处理。

通过上面的简单介绍文件事件处理器,再回顾“ Redis 是单线程的,但为什么可以支持高并发?”的答案,相信你会有不一样的感受!

什么?!还是不太明白 Redis 为什么效率那么高?文件事件处理器的各个组成也不太清楚有什么联系?接下来我通过画图,一步一图的方式尽可能的理清 Redis 线程模型的样貌。

模拟客户端和 Redis 服务器的通信过程

1.在 Redis 服务器初始化的时候,Redis 服务器的 Server Socket 会产生 AE_READABLE 事件并且会与连接应答处理器关联;接下来,IO 多路复用程序监听到 server socket 产生了事件就会将 socket 塞进队列,然后通过文件事件分派器交给连接应答处理器处理。

Redis线程模型-服务器初始化的时候

2.当客户端 A 发起连接 Redis 服务器的时候,实际上是客户端 A 的 socket 与 Redis 服务器的 Server socket 连接,此时 Redis 服务器的连接应答处理器会执行相应客户端 A socket 的应答操作,它会创建一个与客户端 A 连接的 Client A socket ;

当客户端 A 向 Redis 服务器发起请求,实际上是客户端 A Socket 与 Redis 服务器的 Client A Socket 通信,此时 Client A Socket 会产生AE_READABLE事件并且与命令请求处理器关联,然后 IO 多路复用程序监听到客户端 Client A Socket 产生了事件,照旧会塞进队列,再由文件事件分配器交给命令请求处理器接收客户端的请求。

Redis线程模型-客户端发起请求

3.当命令请求处理器处理完 Client A Socket 的命令,Client A Socket 会产生AE_WRITEABLE事件并且与命令回复处理器关联,此时 IO 多路复用程序监听到 Client A Socket 产生事件后,再次将 Client A Socket 塞进队列,由文件事件分派器交给命令回复处理器执行,命令回复处理器会将命令的回复写入 Client A Socket 后由客户端 A 读取,并且解除 Client A Socket 与命令回复处理器的关联。

Redis线程模型-客户端接收响应

总结:

以上就是客户端与 Redis 服务器通信的过程。如果是多个客户端并发向 Redis 服务器发送请求怎么办?其实是相似的,当多个客户端连接 Redis 服务器,连接应答处理器都会创建与客户端通信的 Socket ;在 Redis 服务器内有多个 Socket 怎么办?由于 IO 多路复用程序是非阻塞的,所以会快速的将监听到的 Socket 塞进队列并且由文件事件分派器交给指定的处理器处理。最主要的是,这一系列的过程都是基于内存的单线程操作,由产生 Socket 到被处理器处理整个过程可能都没有几微秒,所以 Redis 才能做到理论上 10+万的QPS。(Redis QPS 受实际机器等环境影响)

参考资料:

《Redis 设计与实现》

中华石杉老师的课程 ——《Java工程师面试突击第一季》

相关文章

  • 为什么单线程的 Redis 性能那么高?带你走近 Redis 线

    聊 Redis 线程模型之前,先思考一个问题:Redis 是单线程的,但为什么可以支持高并发? 这问题的答案我认为...

  • Java-分布式框架-redis-1

    Redis核心原理 Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,...

  • Redis单线程为什么快?

    Redis使用了单线程和I/O多路复用模型来实现高性能的内存数据库服务器。 1 Redis单线程为什么那么快? (...

  • redis高性能-线程模型

    Redis 为什么用单线程 Redis单线程指的什么 Redis 是单线程,主要是指 Redis 的网络 IO 和...

  • Redis为什么那么快

    为什么redis那么快?单线程的redis为什么那么快?在学习使用redis时,都会有这样的疑虑。大家说的redi...

  • Redis

    什么是Redis redis是一个单线程、高性能的key-value存储系统 Redis的特点和优势 性能极高 –...

  • 3:高性能IO模型:为什么单线程Redis能那么快?

    1:Redis单线程的概念? 2:Redis使用单线程和多线程对比? 3:Redis使用单线程为什么这么快? 4:...

  • 【JAVA】一

    为什么在业务里用 Redis, Redis 有什么优点?单线程:并发安全;高性能;原语与数据结构丰富;采用广泛,踩...

  • 谈谈 IO多路复用

    前言 面试的时候经常会问为什么redis单线程,性能那么高?于是很多培训机构的老师说是因为IO多路复用,于是就硬背...

  • 2020最新大厂Redis面试专题

    redis 和 memcached 什么区别?为什么高并发下有时单线程的 redis 比多线程的 memcache...

网友评论

    本文标题:为什么单线程的 Redis 性能那么高?带你走近 Redis 线

    本文链接:https://www.haomeiwen.com/subject/cobngctx.html