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架构实例分 ...
随机推荐
- GitHub实战系列~4.把github里面的库克隆到指定目录+日常使用 2015-12-11
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- SharePoint 2013 create workflow by SharePoint Designer 2013
这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...
- docker进入后台运行的容器
转载请注明出处 我们运行docker容器的时候,使用了-d参数,把容器在后台运行后. 这个时候,我们使用docker ps命令,我们就可以知道哪些程序在后台运行. 我们要怎么进入到docker ...
- MyCat源码分析系列之——前后端验证
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...
- scikit-learn预处理实例之一:使用FunctionTransformer选择列
本例展示怎样在一个管道中使用FunctionTransformer.如果你知道你的数据集的第一主成分与分类任务无关,你可以使用FunctionTransformer选取除PCA转化的数据的第一列之外的 ...
- 【QuickHit项目实例】
关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...
- c# 九九乘法表
static void Main(string[] args) { ; i < ; i++) { ; s <= i; s++) { Console.Write(s + "*&qu ...
- hibernate 中根据id删除一条记录的语句
qid name like content 1 A 1 the first text 2 B 2 the Second text 1 C 3 the Third text 如上表所示,当我们需要某个q ...
- div 加载 html页面的方法
做网页的单页面应用时,需要在一个HTML的Div元素中加载另一个HTML页面,以前有一种方法就是用iframe,举例如下: <div class="main-container&quo ...
- AlloyRenderingEngine之Shape
写在前面 不读文章,只对代码感兴趣可以直接跳转到这里 https://github.com/AlloyTeam/AlloyGameEngine 然后star一下,多谢支持:). 游戏或者应用中,不是所 ...