【redis】redis的架构

一文件事件处理器


【redis】redis的架构_第1张图片
【redis】redis的架构_第2张图片

二 redisIO多路复用

2.1 IO类型

同步阻塞: 调用方阻塞在缓冲区中
同步非阻塞(IO多路复用): 查询缓冲区是否有数据,如果没有数据,直接返回。
异步非阻塞: 缓冲区如果有数据,会调用调用方留下的接口通知调用方。

select函数

在Linux中,我们可以使用select函数实现I/O端口的复用,传递给select函数的参数会告诉内核:

  • 我们所关心的文件描述符
  • 对于每一个文件描述符,我们所关心的状态
  • 我们要等待多长时间

从select函数返回后,内核告诉我们下面信息

  • 对我们的要求已经做好准备的描述符的个数
  • 对于三种条件,哪些描述符已经做好了准备(读,写)

存在的问题:

  • 每一次都需要将rset重新设置为0,然后设置需要关注的客户端socketid,传递给内核执行

epoll函数

epoll函数是select函数的增强版本,没有描述符的限制.epoll使用一个文件描述符管理多个
描述符,将用户关心的文件描述符的事件放在一个事件表中,这样用户空间和内核空间的copy只需要一次

  • int epoll_create(int size); //函数在内核空间开辟一个新的空间,可以理解为epoll结构空间

  • epoll_ctl(int epfd,int op , int fd, struct epoll_event * event) //修改epoll空间内的描述符信息

  • epoll_wait 等待事件的产生,类似于select()函数的调用,根据参数timeout,来决定是否阻塞
    参数一: epfd 指定感兴趣的epoll事件列表
    参数二: *events 是一个指针,必须指向一个epoll_event结构数组,当函数返回时候,内核会把就绪状态的数据拷贝到
    这个数组中
    参数三: maxevent 表示参数二中epoll_event 数组中最多可以接收的数据量
    参数四: timeout 单位为毫秒, 0表示立即返回, -1表示阻塞调用 >0 表示指定了等待事件
    工作模式:
    epoll对文件描述符的操作,有两种模式,LT表示水平触发,ET表示边缘触发,LT 是默认模式。
    总结:
    (1) epoll通过epoll_ctl方法,将需要关注的socket变化传递给了内核,避免了select之间的来回copy
    (2) epoll 将就绪的socketfd返回给了用户端,不需要用户端自己进行判断。
    (3) epoll 对客户端,没有数量限制,select最多是1024个(bitmap最多表示1024个客户端)。

你可能感兴趣的:(MySQL,Java知识,java)