plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么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 网络流 缓存数据详解的更多相关文章
- 浏览器 HTTP 协议缓存机制详解
最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...
- Redis for Windows(C#缓存)配置文件详解
Redis for Windows(C#缓存)配置文件详解 前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...
- MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
- nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解
1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...
- 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项
<深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...
- hibernate缓存机制详解
hiberante面试题—hibernate缓存机制详解 这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...
- 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图
1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...
- MyBatis 一级缓存、二级缓存全详解(一)
目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...
- linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】
本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...
随机推荐
- ElasticSearch 5学习(5)——第一个例子(很实用)
想要知道ElasticSearch是如何使用的,最快的方式就是通过一个简单的例子,第一个例子将会包括基本概念如索引.搜索.和聚合等,需求是关于公司管理员工的一些业务. 员工文档索引 业务首先需要存储员 ...
- 了解HTML列表
前面的话 从某种意义上讲,不是描述性文本的任何内容都可以认为是列表.人口普查.太阳系.餐馆菜单等都可以表示为一个列表或列表的列表.列表分为无序列表.有序列表和定义列表三种 无序列表 无序列表(unor ...
- 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- 快速开发框架CRL3.0发布,附带最新的项目示例CRLShoppingDemo
继上次使用CRL实现大数据分库分表方案升级到2.4,时隔不久又升级到了大版本号3.0,主要是因为结构发生了一些更改 ORM和业务封装Package分开了,增加了实例项目演示代码CRLShoppingD ...
- Vertica 安装,建库,新建测试用户并授予权限,建表,入库
测试环境:RHEL 6.4 + Vertica 6.1.3-7 需求:搭建Vertica数据库3节点的测试环境,建立测试用户,建表,测试数据入库. 1.各节点关闭防火墙和SELinux,配置主机名,I ...
- 11gRAC报错CRS-4535, CRS-4000解决
环境:AIX6.1 + Oracle11.2.0.4 RAC(2 nodes) 1.故障现象 2.定位问题 3.处理问题 1.故障现象 使用crsctl查看集群各资源状态,在任一节点都会直接报错CRS ...
- Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...
- html5语义化标签使用规范
Html5添加了很多语义化标签,一个典型的html5页面结构可以如下安排 一.使用案例 1. 头部——header和nav标签 header头部,body下的直接子元素header一般用于放页面的介绍 ...
- 【那些年关于java多态应用】
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...