首页 > 数据库 >Redis深入理解-Socket连接建立流程以及文件事件处理机制

Redis深入理解-Socket连接建立流程以及文件事件处理机制

时间:2023-11-23 20:00:50浏览次数:42  
标签:Socket Redis redis server 文件事件 线程 连接 socket

Redis Server 运行原理图

Redis深入理解-Socket连接建立流程以及文件事件处理机制_串行化

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

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

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

那么对于 redis server 而言,内部为了支撑并发访问的大量的 redis client,redis 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 通过单线程基于内存进行操作!

标签:Socket,Redis,redis,server,文件事件,线程,连接,socket
From: https://blog.51cto.com/u_16186397/8533919

相关文章

  • WebRTC ,P2P, UDP,NAT,信令,socket
    为什么WebRTC使用UDP?NAT穿透需要UDP。没有NAT穿透,就无法建立P2P连接。UDP不像TCP那样"保证送达“,因此WebRTC在用户级别提供这一特性。你提到的是正确的,NAT(网络地址转换)穿透通常需要使用UDP协议。NAT是一种网络技术,用于将私有IP地址转换为公共IP地址,以便在互联......
  • 【转载】Laravel10.x Session 储存到 Redis
    参考https://learnku.com/docs/laravel/10.x/session/14855#configurationhttps://blog.csdn.net/wen_3370/article/details/88072364注意经过测试Cache的内容默认存储到DB1经过测试Session配置为储存到Redis则默认存储到DB0环境软件/系统版本说明wi......
  • Redis进一步学习
    Redis         AOF(Append-OnlyFile)和RDB(RedisDataBase)是Redis数据库持久化的两种主要方式,它们都用于在Redis服务器重启时保留数据。AOF(Append-OnlyFile):想象一下AOF就像是数据库的操作日志,记录了所有对Redis数据的写操作。每当有一个写操作发生时,比......
  • 【转载】Laravel10.x 使用 Redis
    参考https://blog.csdn.net/china773728236/article/details/123217974https://blog.csdn.net/CrayonShinChaner/article/details/120622009https://blog.csdn.net/l2x1314258/article/details/114965680https://learnku.com/docs/laravel/10.x/redis/14887(如果不方便开启p......
  • socket 错误码
     1#defineEPERM1//Operationnotpermitted操作不允许2#defineENOENT2//Nosuchfileordirectory文件/路径不存在3#defineESRCH3//Nosuchprocess进程不存在4#defineEINTR4//Interruptedsystemcall中断的系统调用5#defineEIO5//I/Oerror......
  • linux socket初步理解
    引用:https://www.bilibili.com/video/BV1aN411U7js/?spm_id_from=333.337.search-card.all.click&vd_source=e05f4a55dd5d8e27f74472aa7fd97acechatgpt1.socket所处的位置:2.socket的工作原理: 3.socket结构描述:  ......
  • redis -- 相关
    https://cloud.tencent.com/developer/article/1553633 1.下载https://redis.io/downloadcd/usr/local/srcwget-chttp://download.redis.io/releases/redis-3.2.6.tar.gz复制2.解压cd/usr/local/srctarxzfredis-3.2.6.tar.gz复制3.编译cd/usr/local/src/re......
  • centos下面的redis开机自启动
    centos下面的redis开机自启动,网上胡说八道的人太多了,其实一句话就解决问题了,那种脚本启动的方式,早就被淘汰了。systemctlenableredis1以上一条命令即可!查看所有的开机启动项:systemctllist-unit-files|grepenabled1这个大大简化了原来的操作,什么各种脚本,各种外挂,早就该丢......
  • socket 的阻塞模式和非阻塞模式
    1.socket的阻塞模式和非阻塞模式在阻塞和非阻塞模式下,常讨论的具有不同行为表现的socket函数一般有connect、accept、send和recv。在Linux上对socket进行操作时也包括write函数和read函数。在Linux上,可以使用fcntl函数或ioctl函数给创建的socket增加ON......
  • GeminiDB新特性:让Redis广告频控爱不释手的exHASH
    本文分享自华为云社区《GeminiDB新特性:让Redis广告频控爱不释手的exHASH》,作者:GeminiDB-Redis博客。exHash类型是一种支持Field过期的新型数据类型,它在原先的Hash类型基础上进行了扩展:在支持Hash类型的通用功能以外,exHash类型还支持为Field设置过期时间和版本,增强了数据结构的灵......