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架构实例分 ...
随机推荐
- 【Win 10应用开发】分阶段进行数据绑定
使用x:Bind扩展标记进行数据绑定,是在编译阶段完成,至于说性能优化方面,大概主要是优化CPU资源的使用,因为免去了运行阶段进行绑定的过程.当然,使用这个标记仅仅是绑定上的优化,并不包括数据源.数据 ...
- ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成
一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...
- 别语言之争了,最牛逼的语言不是.NET,也不是JAVA!
谁都不用说,博客园明显的偏.NET,C#的讨论一出现,推荐讨论热火朝天,而发点JAVA的东西,应者寥寥.一旦有出现两大派系的竞争,那绝对是头条.每天都看,早就麻木了. 研二的我浸淫.NET已经三四年, ...
- geotrellis使用(二十四)将Geotrellis移植到CDH中必须要填的若干个坑
目录 前言 若干坑 总结 一.前言 近期干了一件事情,将geotrellis程序移植到CDH中(关于CDH,可以参考安装ClouderaManager以及使用ClouderaManage ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- 没有神话,聊聊decimal的“障眼法”
0x00 前言 在上一篇文章<妥协与取舍,解构C#中的小数运算>的留言区域有很多朋友都不约而同的说道了C#中的decimal类型.事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是 ...
- Coding4Fun Toolkit支持本地化解决办法
在项目中需要使用Coding4Fun Toolkit中的TimePicker控件, 1. 但是在中文系统下显示的却是英文: 2. 最后发现,需要在源代码中添加中文资源,并重新编译出包含中文语言的dll ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- Git 相关总结
Git 优秀在线教程 廖雪峰-史上最浅显易懂的Git教程!
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...