海外网站空间,免费1级做爰片免费网站,昆山建设网站公司,网站竞争案例Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型
一个 redis 单机#xff0c;可以抗几百上千的并发#xff0c;这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求#xff0c;都需要去建立网络连接#xff0c;同时间可能会…Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型
一个 redis 单机可以抗几百上千的并发这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求都需要去建立网络连接同时间可能会有几百个 redis client 通过 socket 和我们的 redis server socket 建立网络连接
如果自己使用 java socket 编程无论使用 nio、bio一旦要是说一个 server 和一个 client 完成了一个网络连接之后就会多出来一个 socketsocket 是抽象出来通信的模型通过一个 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 中就采用了第一种使用队列进行串行化处理
使用 queue 队列将接收到事件的 socket 放入 queue 中进行排队串行化进行处理将有事件发生的 socket 分发给不同的线程来进行并发的处理开启大量的多线程多个线程并发的去处理不同的 socket 里面的事件
client 和 server 端建立连接的流程为
我们会有一个专门的 socket 去监听端口用于监听来自客户端的连接请求这个连接请求经过 IO 多路复用由 连接应答处理器 进行处理处理的操作其实也就是服务端和客户端进行 TCP 三次握手建立连接建立好连接之后服务端就会创建一个新的 socket这个 socket 就是接收客户端对应的事件
那么连接建立之后客户端对于服务端的一些读写请求就会通过 socket 进行请求请求到达服务端之后通过 IO 多路复用将任务分发给不同的事件处理器进行处理如果是读写请求就将读写的响应通过 socket 响应给客户端
Redis 串行化单线程模型为什么能高并发
首先 Redis 是通过 串行化 单线程 来应对高并发的
Redis 首先是基于内存操作速度很快并且当大量请求进入后都放入队列中进行串行化处理由单个线程直接基于内存进行操作并且单线程的情况下也不需要加锁以及线程上下文切换多线程是很占用 CPU 资源的核心就在于 Redis 通过单线程基于内存进行操作