二、epoll发展及redis基本使用

本文详细介绍了IO模型从阻塞IO(BIO)到非阻塞IO(NIO)再到多路复用IO(NIO-多路复用)的演进,重点解析了Epoll在多路复用中的优化,如通过红黑树和链表实现高效的数据交互。此外,还探讨了Redis的单线程模型如何利用Epoll处理高并发请求,并提供了Redis的基本使用方法,包括查看命令参数、连接不同数据库等。
摘要由CSDN通过智能技术生成

一、BIO到Epoll发展

如果下图是BIO到NIO的多路复用的一个发展图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1QpNF57w-1637997045171)(epoll介绍及redis和NIO的原理.assets/1637894869713.png)]

(一)BIO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kvXPKynD-1637997045174)(epoll介绍及redis和NIO的原理.assets/1637895046279.png)]

客户端传来文件,服务器线程读取fd8文件标识符(read fd8),如果没有的话就会阻塞,一直等待数据包的到达,所以服务器只能开辟新的线程来读取资源才行,如果只用一个线程,即使f9的数据包已经到达,线程还是阻塞的.这样计算机的资源运用起来,所以后面内核发生了变化.

问题:
	1.单线程读取文件描述符,如果数据包未到达会阻塞
	2.若用其他线程在读取其他的文件描述符,线程的切换需要消耗资源	
扩展:
	cpu只有1颗JVM: 一个线程的成本  1MB
	1.线程多了调度成本CPU浪费
	2内存成本

(二)NIO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YybnCB7g-1637997045176)(epoll介绍及redis和NIO的原理.assets/1637895530541.png)]

下载 yum install man man-pages (这是一个帮助文档软件,一共有8类文档)

2:系统调用

指令man 2 read ->系统内核给程序暴露的一个方法->读取文件描述符

​ 原文: read - read from a file descriptor

man socket -> 有一个文件描述符type为SOCK_NONBLOCK

​ 原文: SOCK_NONBLOCK Set the O_NONBLOCK file status flag on the new open file description. Using this flag saves extra calls to fcntl(2) to achieve the same result.

因为多了一个SOCK_NONBLOCK类型的文件描述符,所以可以read多个文件描述符且线程不在阻塞了

同一个线程通过轮询遍历(死循环)的方式,读取fd8,如果没有就读取fd9了,但还是同一个线程完成的,所以是同步非阻塞IO

问题:
	1.如果有很多文件描述符,1000fd,那么用户进程轮询调用1000次kernel,如果这1000次中只有1,2个有返回的数据包
	这样的出现了成本问题,每次都要调用1000次
设想:
	如果我们知道有哪些数据包要返回?这样的话就不用调用1000次

11

(三)NIO-多路复用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgZbD1Nu-1637997045184)(epoll介绍及redis和NIO的原理.assets/1637897732472.png)]

内核继续发展,增加了一个系统调用叫select

man 2 select

原文: select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or
more of the file descriptors become “ready” for some class of I/O operation (e.g., input possible).
A file descriptor is considered ready if it is possible to perform a cor

监控,查询1000fds里面那些已经返回了,返回了的就是ready状态,然后再调用read对应已经准备好的文件描述符,这样就是只有返回数据包的文件描述符我们才read

问题:
	1.存在用户态和内核态,fd文件描述符相关数据拷来拷去(这里的文件描述符指的是否有传输数据的fd)

(三)Epoll-多路复用(完整版)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zjcmFOR-1637997045185)(epoll介绍及redis和NIO的原理.assets/1637980061064.png)]

内核的升级,增加了对于用户空间和内核空间的共享空间mmap(红黑树+链表),省去了文件描述符的拷贝过程

  • 红黑树 放1000fd
  • 链表 放ready的fd
  • 共享空间(mmap)
    1. 原文: creates a new mapping in the virtual address space of the calling process. The starting address for the new mapping is specified in addr.
    2. 该空间的修改是通过内核完成的,查询的话用户和内核均可
    3. 步骤
      1. 线程调用epool,会创建一个epoll的文件描述符(通过它来跟共享空间打交道)
      2. add delete 会在红黑树中进行注册或剔除操作
      3. wait 如果链表有数据就wait之后就返回,返回的是实际的文件描述符
      4. 调用read方法

扩展:

​ 什么是零拷贝?

​ man 2 sendfile

  • 原文: sendfile() copies data between one file descriptor and another. Because this copying is done within

​ the kernel, sendfile() is more efficient than the combination of read(2) and write(2), which would

​ require transferring data to and from user space.

  • 理解:

    ​ 内核之间两个文件描述符的拷贝,不会通过用户,效率更高
    在这里插入图片描述
    sendfile(普通拷贝): file->kernel->kernel缓冲区->read->write->网卡

sendfile(零拷贝): file->kernel->kernel(缓冲区)->网卡

​ Kafka中的零拷贝:
> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3e5H9JDO-1637997045188)(epoll介绍及redis和NIO的原理.assets/1637982768134.png)]
这里零拷贝是用户空间到内核空间减少的这个过程,通过mmap来挂载文件,消费者通过偏移量读数据,走sendfile,输入来自于文件,输出来自消费者.

二、redis原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXAFV5UN-1637997045189)(epoll介绍及redis和NIO的原理.assets/1637984096715.png)]

redis是一个单线程,单实例的程序,如果我们并发很多请求,它是如何变的很快的呢?

​ 多个客户端请求kernel,通过epoll来遍历那些传了请求,并按连接的命令顺序进行逐个处理

​ 如下图所示,niginx也一样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oW2bmBCO-1637997045190)(epoll介绍及redis和NIO的原理.assets/1637984315464.png)]

三、Redis使用

redis默认有16个数据库(0~15),且各个库的数据是独立的,存储的数据是key-value的键值对

1.通过指令可以查看命令参数对应的信息
	redis-cli -h
2.连接端口为6379的redis服务的第8个库
	redis-cli -p 6379 -n 8

问题:如何自学redis呢?
在redis客户端中有help命令(通过tab可补全)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T91nIKJv-1637997045193)(epoll介绍及redis和NIO的原理.assets/1637995445290.png)]

指令:
	1.keys *	查询所有key中指定的类型的key
	2.flushdb 	刷新库,相当于清空
	3.help @String|List|hash|Set|sortedSet 可查看相关操作来学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值