2019独角兽企业重金招聘Python工程师标准>>>

什么是大缓存,按照我的理解,就是超过1MB的缓存都可以称之为大缓存了,频繁的读取超过此大小的文件去进行处理,不管从做项目还是做产品的角度,似乎都是不可理解的。

从数据缓存的角度来说,缓存分为数据缓存和网页缓存,网页缓存是一次性读取,一次性输出的,这个是没有办法,而且也很少看到那个网站的源代码体积几百K的,更不用说超过1024k了;剩下的就是数据缓存,缓存的数据类型无非就是字符串、数组、json、序列化等,一般序列化和JSON数据也是数组转换过来的,我觉得也太麻烦了。如果你真的有超过1MB的数据需要缓存,但是你还在内存中对数据进行格式化,我觉得你完全是要逆天了。

我用一个简单的案例来说说我这个大缓存的存储与读取。

案例:采集

现在采集可以设置从多少页采集到多少页,那么我是不是可以先获取所有的内容页,将内容页网址全部缓存后一条条处理?如果你没有巧妙的读取缓存的思想,而是用平常的一次性读取、一次性处理的思想的话,那绝对要悲剧。几千几万条数据放在缓存里面,也会被你骂成13B了。

现在开始构造缓存,我构造的缓存如下:

<?php 0000000000http://www.xxxx.cc/detail/?1.html
http://www.xxxx.cc/detail/?2.html
http://www.xxxx.cc/detail/?3.html
http://www.xxxx.cc/detail/?4.html
http://www.xxxx.cc/detail/?5.html

不得不解释一下,<?php是防下载,后面的十位数字是表示文件指针移动到哪里来了,是从后面的数据开始算起的,构造代码如下(文件大致为80MB):

$file_handle = fopen("./file.php", "w+");
fwrite($file_handle, '<?php 0000000000');
for ($index = 1; $index <= 2000000; $index++) {fwrite($file_handle, 'http://www.xxxxx.cc/detail/?'.$index.'.html'."\r");
}
fclose($file_handle);

下面讲讲整个数据的读取原理:

  1. 首先将上次缓存读取的指针位置读取出来,读取完之后,指针的位置应该为16
  2. 因为我存储的指针位置恰好是减去了16存储的,那么我在获取到指针位置后,就可以直接跳到指定存储指针
  3. 设置好要读取的行,每遇到一个\r,则计数器+1,一直读取完想要的行数后,跳出
  4. 获取目前的指针位置,然后将目前的指针位置存储到第6到16之间
  5. 当指针移动到文件尾部的时候,或返回false,也可以同时删除缓存。
我已经将读取处理过程写成了一个函数:
//按行读取大文件
function BF($file, $line = 10, $offset = false){if (is_file($file)) {$fp = fopen($file, "r+");if ($offset === false) {fseek($fp, 6, SEEK_CUR);$num = '';for($i=0;$i<10;$i++){fseek($fp, 0, SEEK_CUR);$num .= fgetc($fp);}$offset = (int)$num;}fseek($fp, $offset, SEEK_CUR);$return = array();$readyline = 0;while (!feof($fp)){fseek($fp, 0, SEEK_CUR);$_tmp= fgetc($fp);if ($_tmp == "\r") {$readyline += 1;}if ($readyline >= $line) {break;}if (!isset($return[$readyline])) {$return[$readyline] = '';}$return[$readyline] .= $_tmp;}$offset = ftell($fp);fseek($fp, 6-$offset, SEEK_CUR);$offset = str_pad($offset-16, 10, 0, STR_PAD_LEFT);for($i=0;$i<10;$i++){fseek($fp, 0, SEEK_CUR);fwrite($fp, $offset{$i});}fclose($fp);return $return;} else {throw new Exception($file.'::不存在');}
}

效率测试代码(不要使用你2B的行为来个for循环,完全不符合处理实际需要):

$startTime = microtime(true);
$startMem = memory_get_usage();
$print = BF('./file.php', 10);
print_r($print);
echo '<br />runtime:'.round((microtime(true) - $startTime)*1000, 4).'ms<br />';
$size = memory_get_usage()-$startMem;
$unit=array('b','kb','mb','gb','tb','pb');
echo round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i].'<br />';

我将指针移动到263563了,读取效率为:

runtime:5.5821ms
memory:2.67 kb

消耗的内存真是惊人,惊人的小

转载于:https://my.oschina.net/longxuu/blog/142074

php操作大缓存的存储与读取相关推荐

  1. ESP32_学习笔记(一)NVS的操作(存储和读取大数组)(为什么存入数据成功,读取却为零的原因)

    目录 ESP32_学习笔记(一)NVS的操作 前言 函数介绍 创建句柄: 定义存储空间: 打开函数: 存储函数: 读取函数: 提交函数: 关闭函数: 易错点提醒:为什么明明存入了,读取的值为0 这就是 ...

  2. php如何从mongo获取视频文件,使用mongodb对文件(图片、音频、视频)的存储、读取操作...

    使用mongodb对文件(图片.音频.视频)的存储.读取操作 实现代码示例: package mongo.util; import java.io.File; import java.io.IOExc ...

  3. Android文件存储编程实验,Android编程中File文件常见存储与读取操作demo示例

    本文实例讲述了Android编程中File文件常见存储与读取操作.分享给大家供大家参考,具体如下: MainActivity文件代码如下: package example.com.myapplicat ...

  4. Redis实现求交集操作结果缓存的设计方案

    Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...

  5. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎

    第1章 MySQL体系结构和存储引擎 1.1数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.实例:MySQL数据库由后台线程以及一个共享内存区组成.共享内存可以被运行 的后台线程所共享 ...

  6. 关于InnoDB存储引擎 text blob 大字段的存储和优化--转载

    最近在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,单表的存储空间已经达到了近100G,这种情况再去改变和优化就非常难了 一.简介 为了清楚大字段对性能的影响,我们必须要知道i ...

  7. 前端缓存 浏览器存储

    目录 前言 一.浏览器存储 0.bfcache 1.WebStorage (1).sessionStorage 对象 (2).localStorage 对象 2.Cookie (1).cookie 与 ...

  8. OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念...

    先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...

  9. HBase上关于CMS、GC碎片、大缓存的一种解决方案:Bucket Cache

    介绍BucketCache前,先对HBase的Cache做个介绍:  一.HBase在读取时,会以Block为单位进行cache,用来提升读的性能: 二.Block可以分类为DataBlock(默认大 ...

  10. 怎么对MySQL数据库操作大数据?这里有思路

    最近学到一招关于使用java代码操作MySQL数据库,对大文本数据(LOB)进行CRUD的技巧,虽然向数据库很少向中存入大文本文件(一般都是存储在硬盘上),但是还是很有必要知道这一技巧的.下面我就来说 ...

最新文章

  1. sgSpeedMode.js判断360浏览器是“兼容模式”,提示使用“极速模式”
  2. 程序员缺乏经验的 7 种表现!
  3. 南通一酒店搞了个“虎景房”,这睡得着?
  4. python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2)
  5. 血型算法php,血型排行榜!(真的很准)
  6. Android 功耗优化(4)---android 7.0低电耗Doze模式
  7. canvas元素简易教程(7)(大部分转自火狐,自己只写了简单的代码分析)
  8. 构造器2(Java)
  9. python3 一年中的天数 时间转化为北京时_三年级数学《年月日》时间知识详解,帮助孩子重点知识不丢分...
  10. python实现两个任意字符串乘积
  11. java内存泄露 垃圾回收_Java面试中底层垃圾回收、代码安全、内存泄露
  12. npy文件的处理方式
  13. 小白进阶之影片TS版,TC版,CAM版,HD版,BD版,DVD,HDVD等版本介绍
  14. STM32 CAN通信协议详解—小白入门(一)
  15. cmd /c和cmd /k 以及CMD命令
  16. Android 开源控件
  17. 自举电路工作原理分析
  18. 蓄水池采样算法的python实现_蓄水池采样算法的python实现_蓄水池抽样及实现
  19. 并发和并行的区别?一个很容易混淆,被忽略的问题
  20. mapreduce运行的bug收录

热门文章

  1. 报错’TypeError: only integer scalar arrays can be converted to a scalar index‘
  2. IDL代码实现湖泊水体范围遥感提取
  3. PHP裁剪图片且保留背景透明
  4. sublime3安装常用插件
  5. linux qt 触摸屏事件,利用触摸屏获取事件坐标
  6. CentOS7.3系统Tomcat无法正常启动解决(8005端口不能启动)
  7. css的list,CSS List 入门教程
  8. Flink 在众安保险金融业务的应用
  9. python基础篇 —— 类
  10. 计算机科学引论2答案,计算机科学引论答案-20210311090508.docx-原创力文档