redis

redis

php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能

分享dingfei 发表了文章 • 3 个评论 • 478 次浏览 • 2019-05-16 21:19 • 来自相关话题

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。 三、具体实现:1.利用linux的写时复制技术。运行php主 ...查看全部
一、效果:每秒读取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

配置redis时,无法找到redis类,我确认已经安装redis扩展和redis服务器

提问cmh 回复了问题 • 3 人关注 • 3 个回复 • 2321 次浏览 • 2018-12-27 14:03 • 来自相关话题

Gatewayworker奇异的RedisException-Redis连接异常问题

提问walkor 回复了问题 • 2 人关注 • 4 个回复 • 811 次浏览 • 2018-11-26 16:42 • 来自相关话题

启动包含redis的心跳后报错,第一次用不大明白

提问evilk 回复了问题 • 3 人关注 • 4 个回复 • 1763 次浏览 • 2017-08-23 16:38 • 来自相关话题

Gateway,连接Redis写入,客户端多的情况下,是否会出现redis大量连接不上的可能性?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1615 次浏览 • 2017-06-28 16:03 • 来自相关话题

关于redis持久连接问题

提问hq 回复了问题 • 3 人关注 • 7 个回复 • 2832 次浏览 • 2017-04-23 00:25 • 来自相关话题

使用 GatewayWorker + redis 使用出现问题

提问damao 回复了问题 • 2 人关注 • 1 个回复 • 4064 次浏览 • 2016-11-25 14:29 • 来自相关话题

GatewayWorker 怎么使用redis进行存储聊天信息

提问walkor 回复了问题 • 1 人关注 • 1 个回复 • 2192 次浏览 • 2016-01-12 11:53 • 来自相关话题

缓存获取问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1230 次浏览 • 2015-12-22 20:00 • 来自相关话题

新手请教关于 Gateway 1.0 中 Store的使用规则问题

提问walkor 回复了问题 • 1 人关注 • 1 个回复 • 1028 次浏览 • 2015-12-04 16:26 • 来自相关话题

好吧,我新手,应该使用的是Gateway 2.0,所以我找不到Redis相关的内容,请教啊

提问jzgenius 回复了问题 • 2 人关注 • 3 个回复 • 1402 次浏览 • 2015-12-04 10:22 • 来自相关话题

刁钻的redis问题 exception 'RedisException' with message 'Redis server went away'

提问whengbbs 回复了问题 • 2 人关注 • 3 个回复 • 2519 次浏览 • 2015-11-18 12:24 • 来自相关话题

如何使workerman支持redis集群

提问aguai 回复了问题 • 3 人关注 • 3 个回复 • 1987 次浏览 • 2015-11-14 14:14 • 来自相关话题

关于在gateway中使用redis的问题

提问unsco 回复了问题 • 2 人关注 • 2 个回复 • 2176 次浏览 • 2015-10-29 21:33 • 来自相关话题

配置redis时,无法找到redis类,我确认已经安装redis扩展和redis服务器

回复

提问cmh 回复了问题 • 3 人关注 • 3 个回复 • 2321 次浏览 • 2018-12-27 14:03 • 来自相关话题

Gatewayworker奇异的RedisException-Redis连接异常问题

回复

提问walkor 回复了问题 • 2 人关注 • 4 个回复 • 811 次浏览 • 2018-11-26 16:42 • 来自相关话题

启动包含redis的心跳后报错,第一次用不大明白

回复

提问evilk 回复了问题 • 3 人关注 • 4 个回复 • 1763 次浏览 • 2017-08-23 16:38 • 来自相关话题

Gateway,连接Redis写入,客户端多的情况下,是否会出现redis大量连接不上的可能性?

回复

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1615 次浏览 • 2017-06-28 16:03 • 来自相关话题

关于redis持久连接问题

回复

提问hq 回复了问题 • 3 人关注 • 7 个回复 • 2832 次浏览 • 2017-04-23 00:25 • 来自相关话题

使用 GatewayWorker + redis 使用出现问题

回复

提问damao 回复了问题 • 2 人关注 • 1 个回复 • 4064 次浏览 • 2016-11-25 14:29 • 来自相关话题

GatewayWorker 怎么使用redis进行存储聊天信息

回复

提问walkor 回复了问题 • 1 人关注 • 1 个回复 • 2192 次浏览 • 2016-01-12 11:53 • 来自相关话题

缓存获取问题

回复

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1230 次浏览 • 2015-12-22 20:00 • 来自相关话题

新手请教关于 Gateway 1.0 中 Store的使用规则问题

回复

提问walkor 回复了问题 • 1 人关注 • 1 个回复 • 1028 次浏览 • 2015-12-04 16:26 • 来自相关话题

好吧,我新手,应该使用的是Gateway 2.0,所以我找不到Redis相关的内容,请教啊

回复

提问jzgenius 回复了问题 • 2 人关注 • 3 个回复 • 1402 次浏览 • 2015-12-04 10:22 • 来自相关话题

刁钻的redis问题 exception 'RedisException' with message 'Redis server went away'

回复

提问whengbbs 回复了问题 • 2 人关注 • 3 个回复 • 2519 次浏览 • 2015-11-18 12:24 • 来自相关话题

如何使workerman支持redis集群

回复

提问aguai 回复了问题 • 3 人关注 • 3 个回复 • 1987 次浏览 • 2015-11-14 14:14 • 来自相关话题

关于在gateway中使用redis的问题

回复

提问unsco 回复了问题 • 2 人关注 • 2 个回复 • 2176 次浏览 • 2015-10-29 21:33 • 来自相关话题

php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能

分享dingfei 发表了文章 • 3 个评论 • 478 次浏览 • 2019-05-16 21:19 • 来自相关话题

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。 三、具体实现:1.利用linux的写时复制技术。运行php主 ...查看全部
一、效果:每秒读取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