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架构实例分 ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
系列目录 本节知识点 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI读取MVC后台Json数据 开始实现 我们的系统似乎越来越有趣了 首先从前端入手,开打View下面的Sh ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java Collection开发技巧
Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...
- 计算机程序的思维逻辑 (8) - char的真正含义
看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...
- 日常css技巧小结(1)--背景透明度改变对内容无影响
刚开始出现的错误,内容会受到背景透明度改变的影响:如图: 代码: <!DOCTYPE html> <html lang="en"> <head> ...
- C# 设置Excel打印选项及打印excel文档
C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作,但有时候我们会碰到各种不同的打印需求,例如只打印一个Excel工作表的其中一部分,或打印时每页都有表头,或把工作 ...
- 【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题
项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明 ...
- Java中的泛型 (上) - 基本概念和原理
本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...
- ASP.NET MVC5 ModelBinder
什么是ModelBinding ASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应.为了能够正确处理请求,Action的 ...