博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能
阅读量:4349 次
发布时间:2019-06-07

本文共 2269 字,大约阅读时间需要 7 分钟。

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。

三、具体实现:1.利用linux的写时复制技术。运行php主进程一次性读取所有的数据保存到数组中,然后通过workerman监听端口。每次收到请求时:创建一个子进程去执行任务,执行完成之后子进程自动结束。
      2.子进程完全共享主进程的数组,不消耗内存。
四、代码

ini_set('memory_limit','5872M');    // 临时设置最大内存占用为5G        $a = [[[[]]]];        $start = microtime(true);        for ($i=0; $i<=200; $i++) {            for ($j=0; $j<=100; $j++) {                for ($k=0; $k<=1000; $k++) {                    $a[$i][$j][$k] = '我是一条数据';                }            }        }        //  2000万数据,时间1秒,消耗内存720M。 相当于1000万-0.5秒-360M        echo  microtime(true) - $start, "s。主进程写入完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB";        $start = microtime(true);        for ($i=0; $i<=200; $i++) {            for ($j=0; $j<=100; $j++) {                for ($k=0; $k<=1000; $k++) {                    $m =  $a[$i][$j][$k] ;                }            }        }        echo  microtime(true) - $start, "s。主进程读取完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB";        $start = microtime(true);        $intNum= 1; // 进程总数        $pids= array(); // 进程PID数组        for($i= 0; $i<$intNum; $i++)        {            $pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且继承父进程的所有变量            if($pids[$i] == -1){echo"couldn't fork". "\n";            }elseif(!$pids[$i]){                $m= 0;                $start = microtime(true);                for ($i=0; $i<=200; $i++) {                    for ($j=0; $j<=100; $j++) {                        for ($k=0; $k<=1000; $k++) {                            $m =  $a[$i][$j][$k] ;                        }                    }                }                echo  microtime(true) - $start, "s。子进程读取完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB";                                sleep(100);                exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程            }        }        echo  microtime(true) - $start, "s。子进程创建完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB";        sleep(200);

五:代码运行结果:
1.0883929729462s。主进程写入完成,当前内存:719.90679168701MB
0.66096806526184s。主进程读取完成,当前内存:719.90679168701MB
0.0097589492797852s。子进程创建完成,当前内存:719.90715026855MB
0.72923994064331s。子进程读取完成,当前内存:719.90715026855MB

原文章路径:

 

转载于:https://www.cnblogs.com/MoMeak123/p/10903961.html

你可能感兴趣的文章
20180925-4 单元测试
查看>>
Web应用安全审计工具WATOBO
查看>>
人工智能03 状态机
查看>>
(转)Mysql 安装与卸载
查看>>
JS Post 传参
查看>>
PowerMockRunner和ActiveObjectsJUnitRunner
查看>>
Linux_jdk
查看>>
HTML入门1—HTML基础学习
查看>>
在vs2005中使用SVN进行版本管理
查看>>
实现类似百度文库效果,防止用户下载。
查看>>
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>
go web framework gin group api 设计
查看>>
linux下使用dd命令写入镜像文件到u盘
查看>>
001---进程
查看>>