本文介绍: 当 server 端保持了大量的 redis client连接,可能在同一时间,大量的 redis client 并发的给 server发送大量的请求redis server 内部大量的 socket 会突然同一时间产生大量的事件(例如 read 事件write 事件)那么连接建立之后,客户端对于服务端的一些读写请求就会通过 socket 进行请求,请求到达服务端之后,通过 IO 多路复用任务分发给不同的事件处理器进行处理,如果是读写请求,就将读写响应通过 socket 响应客户端

Redis Server 运行原理

在这里插入图片描述

Redis 服务器中 Socket 网络建立以及文件事件模型

一个 redis 单机,可以抗几百上千的并发这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求,都需要去建立网络连接,同时间可能会有几百个 redis client 通过 socket我们redis server socket 建立网络连接

如果自己使用 java socket 编程,无论使用 niobio,一旦要是说一个 server一个 client 完成了一个网络连接之后,就会多出来一个 socket,socket 是抽象出来通信模型,通过一个 socket 就可以跟对方的 socket 形成一个连接

那么对于 redis server 而言,内部为了支撑并发访问的大量的 redis clientredis server 内部就会有几百个 socket,网络连接同时在维持着

因此呢,在 bio 模式下,一个 socket 连接就对应了一个线程监听请求

nio 模式下,可以实现 IO 多路复用,一个线程就可以监听多个 socket 的网络事件

redis server 中,就是通过 FileEventHandler 进行多路复用

socket 中会产生一些网络事件,accept连接应答)、read(有数据可以读的事件)、write(有数据可以写的事件)、close(连接关闭) 在 redis 中这些网络事件都被抽象文件事件

基于队列串行化的文件事件处理机制

针对 server 端的大量的 socket,不太可能每一个 socket 都使用一个线程监听,因为线程资源不够,所以不会采用 bio 模式,因此解决方案就是针对大量的 socket,使用一个线程监听 n 多个 socket,采用 IO 多路复用模式

server 端保持了大量的 redis client 的连接,可能在同一时间,大量的 redis client 并发的给 server 端发送大量的请求,redis server 内部大量的 socket 会突然同一时间产生大量的事件(例如 read 事件,write 事件)

对于这些网络事件的处理,有两种解决方案(Redis Server 中就采用了第一种,使用队列进行串行处理):

client 和 server 端建立连接的流程为:

我们会有一个专门的 socket 去监听端口用于监听来自客户端的连接请求,这个连接请求经过 IO 多路复用,由 连接应答处理器 进行处理,处理的操作其实也就是服务端客户端进行 TCP 三次握手建立连接,建立好连接之后服务端就会创建一个新的 socket,这个 socket 就是接收客户端对应的事件

那么连接建立之后,客户端对于服务端的一些读写请求就会通过 socket 进行请求,请求到达服务端之后,通过 IO 多路复用任务分发给不同的事件处理器进行处理,如果是读写请求,就将读写响应通过 socket 响应客户端

Redis 串行化单线程模型为什么能高并发?

首先 Redis 是通过 串行化 + 单线程 来应对高并发的

Redis 首先是基于内存操作,速度很快,并且当大量请求进入后,都放入队列中,进行串行化处理,由单个线程直接基于内存进行操作,并且单线程的情况下也不需要加锁以及线程上下文切换多线程是很占用 CPU 资源的),核心就在于 Redis 通过单线程基于内存进行操作!

原文地址:https://blog.csdn.net/qq_45260619/article/details/134584620

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8938.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注