网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块。该部分为PF现有的网络流模型,但是在这里只讲解最本质的概念,而没有详细说明代码,如果有兴趣的不妨先看了这部分再去看下代码,一切或许会豁然开朗。

网络流

  如果你不知道计算机中流数据模型的定义,那么你就可以试想一下河流,有着固定起点和终点的河流。将流水从某一个地方送向另一个地方的通道,我们现实中一般叫做渠道,这种渠道在计算机之间就是网络,而其中的流水便称之为网络流,其实同其他的数据流并没有什么本质上的区别。与现实中的河流不一样的,就是一般河流只有一个方向,但是网络中流向可以是从起点到终点,也可以从终点向起点,是一个双方向的流。通过下图,我们看下网络流简单的模式:

网络数据缓存

  缓存的概念是相对于网络流的,如果是单纯的网络流,是不需要任何的缓存数据。在我们建立一个连接,打开了双方之间的双通道的时候,我们就可以向对方传输/接收数据。那么我们为什么会依赖它,如果没有这步不是更简洁么?的确增加这个机制会使我们的代码看起来复杂,但是复杂和简单是想依赖的,有些时候为了简单我们需要复杂。那这又是为什么呢?下面一步步慢慢讲解。

  1、概念

    这并不是一个新的事物,现在已经广泛的被运用在各种应用中,这就是为什么有些人经常说net buffer。c/c++的朋友们应该很了解,这里的buffer让我们容易联想到内存,而这里的缓存当前也就是内存,在其他脚本中我们往往用到temp的机制,这些同样的也是内存的机制。网络流缓存就是基于内存的一段反复可被利用的数据,也可以说是一段专为处理网络流服务的内存。

  2、两个重要位置

    1) 头位置(head)

      头位置用来记录当前发送/读取到的数据位置,当数据发送/读取的时候该位置向后移动(如同算术右移)。

    2)数据位置(tail)

      数据位置用来记录当前接收/写入的数据位置,当数据的接收/写入的时候该位置向后移动(如同算术右移)。

  3、两个重要数据

    1)空闲数据

      空闲数据段,指的是这段数据出于空闲的状态,在有网络数据的接收和写入的时候可以利用的内存段。

    2)有效数据

      有效数据段,指的是当前这段数据已被占用,与空闲数据相对。我们发送和读取的数据,必须是有效的数据。

  4、内存的常见状态

    1)向缓存中写入一段数据

    2)内存中发送一段数据

    3)内存写入并发送数据

  5、动态展示缓存内存的状态

    下图中橙色的部分为有效数据,白色为空闲数据,在这里我们展示的是输出流的内存缓存状态。对应输出流的状态基本一致,只不过将这里的写入换成接收,将发送换成读取。

    1)最初始的时候,整个内存为空白的状态,此时头位置和内容位置重叠,当写入数据后内容位置向后移动

    2)内存中有了有效数据后,我们就可以将有效数据通过套接字发送出去,这个时候头位置向后移动(第一个框为头位置,第二个为内容位置)

    3)接着第2步,我们这个时候如果再向内存中写入一段数据,则内容位置继续向后移动(第一个框为头位置,第二个为内容位置)

    4)接着第3步,我们这个时候如果向内存中读取一段数据并发送,则头位置继续向后移动(第一个框为头位置,第二个为内容位置)

    5)在第4步后,没有写入新的数据,我们接着发送内存中的有效数据,直到头位置和内容位置重叠,这个时候整个缓存都为空闲状态(第一个框为头位置,第二个为内容位置)

   6)经过多次写的操作后,可能我们的内容位置已经超出了整个空闲内存的大小,这个时候我们就需要重复使用前面的内存了(第一个框为内容位置,第二个为头位置)

  6、为什么需要选择网络流缓存?

    一是为了避免频繁的操作套接字接口造成性能上的问题;二是为了方便控制处理网络数据,如数据加密压缩,我们往往都放在缓存中,当我们从里面读取和写入的时候不需要特殊的去处理它。

PF商业版核心人员招募

开篇语
  我们没有大神,只有解决问题的人。
  我们没有强悍的技术,只有一颗向往简单的心。
  我们没有惊人的理论,只有一堆不可思议的妄想。
  我们不需要复杂,只需要够简洁。
  我们不需要固定的思维,只需要你能想得到。

核心成员资格需求
  1、精通或熟练掌握一门语言
  2、能够接受和遵从谷歌C++代码风格
  3、灵活而大胆的思考问题
  4、能够在规定时间段内完成自己分配的模块(可以灵活调度)
  5、有坚持不懈的动力(很重要)

核心成员项目优势
  1、无限制的使用商业版到自己的项目中,如果是别的项目则需要和所有成员商量
  2、在过程中,你可以得到飞一般的技术提高
  3、商业版如果有盈利核心成员的利益将会最大

  名额有限,如果大家想加入的话,请发送一段自己熟悉的语言利用plain framework(简称PF)风格的代码到邮箱viticm.ti@gmail.com,我们将尽快的在15年前确定人选,因为商业版的计划从15年1月份开始。

PF托管地址

  https://github.com/viticm/plainframework1

PF安装教程

  http://www.cnblogs.com/lianyue/p/3974342.html

PF交流QQ群

  

plain framework 1 网络流 缓存数据详解的更多相关文章

  1. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

  2. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  3. MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...

  4. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...

  5. 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

    <深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面   MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...

  6. hibernate缓存机制详解

    hiberante面试题—hibernate缓存机制详解   这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...

  7. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

  8. MyBatis 一级缓存、二级缓存全详解(一)

    目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...

  9. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

随机推荐

  1. .NET Core的文件系统[2]:FileProvider是个什么东西?

    在<读取并监控文件的变化>中,我们通过三个简单的实例演示从编程的角度对文件系统做了初步的体验,接下来我们继续从设计的角度来继续认识它.这个抽象的文件系统以目录的形式来组织文件,我们可以利用 ...

  2. 创建 Pool & VIP - 每天5分钟玩转 OpenStack(122)

    上节完成了 LBaaS 配置,今天我们开始实现如下 LBaaS 环境. 环境描述如下: 1. 创建一个 Pool “web servers”. 2. 两个 pool member “WEB1” 和 “ ...

  3. 4.C#WinForm基础图片(显示和隐藏)

    要求: 软件上有一张图片,默认是隐藏的.用户在文本框中输入身份证号(131226198105223452),点击按钮,如果年龄大于18岁,则显示图片. 知识点: 取当前年份,Date Time Now ...

  4. CentOS7使用firewalld打开关闭防火墙与端口

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disab ...

  5. .net汉字转字母

    目前手上有一个需要实现:将用户输入的姓名转换成汉语拼音. 使用枚举,既麻烦又易出错,发现有一个微软拼音转换工具类ChnCharInfo.dll,在此记录下: 首先需要引入此dll, 链接: http: ...

  6. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

  7. WebApi系列~StringContent与FormUrlEncodedContent

    回到目录 知识点 本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent ...

  8. 实现跨浏览器html5表单验证

    div:nth-of-type(odd){ float: left; clear: left; } .origin-effect > div:nth-of-type(even){ float: ...

  9. Angular2 小贴士 NgModule 模块

    angular2 具有了模块的概念,响应了后台程序的号召,高内聚 低耦合.模块就是用来进行封装,进行高内聚  低耦合的功能. 其实各人认为ng2 的模块和.net的工程类似,如果要使用模块中定义的功能 ...

  10. reStructuredText(rst)快速入门语法说明

    reStructuredText 是扩展名为.rst的纯文本文件,含义为"重新构建的文本"",也被简称为:RST或reST:是Python编程语言的Docutils项目的 ...