redis学习笔记(一)

探讨了BIO模型的并发局限和内存消耗,对比了NIO模型的非阻塞特性,以及如何通过线程池和selector优化服务器性能。
摘要由CSDN通过智能技术生成

一个线程(6.0的多线程是指I/O数据的收发多线程,业务逻辑还是单线程)处理很高并发,十万并发。
通过多路复用
线程模型,类似于NIO
线程源码在(src/e_epoll.c,e_evport.c,e.h,e_kqueue.c,e_select.c)
BIO模型
redis,netty等底层就是IO通信程序
在这里插入图片描述

serverscoket就是一个BIO模型,创建BIO类,监听9000端口,
serversocket就是建立一个客户端连接
执行发现客户端没有连接,程序阻塞了
因为BIO程序规定没有客户端连接就阻塞,有客户端连接后才跳出阻塞
BIO提供的api都是阻塞的,阻塞中等待某些操作,无法支持高并发
在这里插入图片描述
通过多线程可以处理多个客户端的并发,但在生产环境,同一时刻创建100k或更多线程就会创建100k个线程,占用超多内存空间,导致内存溢出
此时可以设置POOL(500)线程池,但并发跟线程池的数量相关,限制很大

NIO模型
同样建立一个进程监听9000端口,但设置为非阻塞模式
在这里插入图片描述
服务器没有在serversocket.acceptz阻塞,socketchannel值为null在这里插入图片描述
一个线程一直循环,只要收发数据时间不要太长导致阻塞,就可以在很短时间处理很多连接。
但会对cpu要求很高,并且如果没有连接也会一直循环,效率不高
每次处理连接要遍历整个建立了连接客户端list
在这里插入图片描述
解决方法:建立一个 建立了连接的connectlist 这个list为空的时候就阻塞,让出cpu

调用open方法,创建一个selecter多路复用器,把serversocketchannel服务端注册到selector上
并且让selector传了一个OP_ACCEPT(IO事件,如连接事件,读写时间)
让selector监听服务端的连接事件
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值