【redis】redis的架构

一文件事件处理器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二 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个客户端)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值