解决高并发 io瓶颈解决红包程序

本程序模拟的红包抽奖模式。总金额100元,随机用户获得1-10元的红包,直到红包分发完。

redis中luckMoneyMax需要提前设置

$r->set('luckMoneyMax' , 100);

正文

/**

* 随机获取红包

* 总金额100元

* 每次红包大小[1,10]

*/

public function luckMoney()

{

$r = new \Redis();

$r->pconnect('127.0.0.1','6379');

$r->select(1);

$lock_key = 'lockkey';

while(true){

$lock_timout = time()+3+1;

//4秒超时 一个锁超过4s还没释放 说明得到锁的线程挂了 其他线程需要竞争释放锁 再得到锁

$get_lock = $r->setnx($lock_key,$lock_timout);

//得到锁的条件 setnx返回值为真 超时并且getSet保证了不会多个进程去释放锁

$now = time();

if($get_lock || ( ($now > $r->get($lock_key)) && ($now > $r->getSet($lock_key , $lock_timout)) ) ){

echo '去抽奖!
';

break;//去抽奖

}

}

$luckMoneyMax = $r->get('luckMoneyMax');

if($luckMoneyMax <= 0){

echo '奖金池空了!';

if((time() < $lock_timout) && $r->del($lock_key)){

echo '
毫秒时间:'.$this->msectime().'释放锁成功';

}

return;

}elseif($luckMoneyMax <= 1){

$redBag = $luckMoneyMax;

$r->set('luckMoneyMax' , 0);

$data_arr = [

'redBag'=>$redBag,

'mstime'=>$this->msectime()

];

$r->lpush("redBag-list", serialize($data_arr));

echo '恭喜中奖'.$redBag;

if((time() < $lock_timout) && $r->del($lock_key)){

echo '
毫秒时间:'.$this->msectime().'释放锁成功';

}

return;

}

//1-10 十元整数

$redBag = rand(1,10);

$tmp_money = $luckMoneyMax-$redBag;

if($tmp_money < 0){

$redBag = $luckMoneyMax;

$tmp_money=0;

}

$r->set('luckMoneyMax' , $tmp_money);

$data_arr = [

'redBag'=>$redBag,

'mstime'=>$this->msectime()

];

$r->lpush("redBag-list", serialize($data_arr));

echo '恭喜中奖'.$redBag.'元';

if((time() < $lock_timout) && $r->del($lock_key)){

echo '
毫秒时间:'.$this->msectime().'释放锁成功';

}

}

/**

* 毫秒级

* @return float

*/

public function msectime() {

list($msec, $sec) = explode(' ', microtime());

$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);

return $msectime;

}

swoole多线程测试

echo "start:".date("Y-m-d H:i:s").PHP_EOL;

for ($i=0 ; $i<100 ;$i++){

$red_process = new swoole_process('getMoney',true);

$red_process->start();

echo PHP_EOL;//PHP_EOL换行的意思

echo $red_process->read();

echo PHP_EOL;

}

echo "end:".date("Y-m-d H:i:s").PHP_EOL;

function getMoney(swoole_process $worker)

{

$content = getHTTPS('http://example.com/index/index/luckMoney.html');

$worker->write($content);

}

function getHTTPS($url) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_REFERER, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$result = curl_exec($ch);

curl_close($ch);

return $result;

}

日志记录结果

2s 100 次就抽取完毕

毫秒

红包金额

毫秒时间1514386342125

红包10元

毫秒时间1514386342106

红包10元

毫秒时间1514386342086

红包10元

毫秒时间1514386342066

红包7元

毫秒时间1514386342046

红包6元

毫秒时间1514386342026

红包5元

毫秒时间1514386342007

红包3元

毫秒时间1514386341988

红包1元

毫秒时间1514386341968

红包7元

毫秒时间1514386341950

红包5元

毫秒时间1514386341931

红包8元

毫秒时间1514386341913

红包7元

毫秒时间1514386341894

红包1元

毫秒时间1514386341875

红包1元

毫秒时间1514386341856

红包9元

毫秒时间1514386341836

红包10元

合计

100元

php抢红包 并发 超时,处理高并发 IO瓶颈解决红包程序相关推荐

  1. 心跳与超时:高并发高性能的时间轮超时器

    在许多业务场景中,我们都会碰到延迟任务,定时任务这种需求.特别的,在网络连接的场景中,常常会出现一些超时控制.由于服务端的连接数量很大,这些超时任务的数量往往也是很庞大的.实现对大量任务的超时管理并不 ...

  2. 到底多大并发才算高并发?一文带你全面认识高并发!

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 作者 | 骆俊武 来源 | IT人的职场进阶 高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大 ...

  3. 到底多大并发才算高并发?

    高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深度上不断 ...

  4. JavaWeb 并发编程 与 高并发解决方案

    在这里写写我学习到和自己所理解的 Java高并发编程和高并发解决方案.现在在各大互联网公司中,随着日益增长的互联网服务需求,高并发处理已经是一个非常常见的问题,在这篇文章里面我们重点讨论两个方面的问题 ...

  5. 什么是并发、高并发以及实现高并发需要考虑的因素

    文章目录 1.什么是并发 2.什么是高并发 3.实现高并发需要考虑的因素 3.1 高性能 3.1.1 网络 3.1.2 CPU 3.1.3 内存 3.1.3.4 IO 3.2 高可用性 3.3 高扩展 ...

  6. 01 - Java并发编程与高并发解决方案笔记-基础篇

    01 - Java并发编程与高并发解决方案笔记-基础篇 基础篇很重要!很重要!很重要!!!一定要理解和认真思考. 01 - Java并发编程与高并发解决方案笔记-基础篇 1.课程准备 2.并发编程基础 ...

  7. java并发编程与高并发解决方案

    知识点 线程安全,线程封闭,线程调度,同步容器,并发容器,AQS,J.U.C,等等 高并发解决思路与手段 扩容:水平扩容.垂直扩容 缓存:Redis.Memcache.GuavaCache等 队列:K ...

  8. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  9. 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记

    <Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...

最新文章

  1. nginx如何解决超长请求串
  2. 深入剖析SolrCloud(一)
  3. 30 天精通 RxJS (05): 建立 Observable(一)
  4. 在java web项目中编写自己的代码生成器
  5. 动态管理配置文件扩展接口EnvironmentPostProcessor
  6. linux删除git账号密码忘记了,linux清除git账号密码
  7. vue 指令 v-bind
  8. 星云STS 常用配置
  9. new方法、定制属性、描述符、装饰器
  10. L298N电机驱动电路
  11. Word VBA 绘制直尺
  12. 加密狗工作原理和破解方法简介
  13. 基于Python的Climate Indices库计算SPEI(标准化降水蒸散发指数)03—单站点不同时间尺度的SPEI计算
  14. JVM(十) - 性能调优
  15. 北大计算机科学系 97届,北大一专业:六代单传、一人旷课全系放假,毕业照只有一个人...
  16. LP框架| 三分钟快速构建分布式微服务系统(一)
  17. 适用于 PC 的最佳 Android 操作系统(2022 版)
  18. 程序员笔记软件cherrytree推荐
  19. git代码规范检测工具
  20. 浅谈web架构之架构设计(总结)

热门文章

  1. 什么是JVM?什么是JDK? 什么是JRE?
  2. 一文看懂中国人工智能产业全貌
  3. Python画乔治的玩具恐龙
  4. [Activiti] UEL 统一表达式语言 (任务节点 Assignee 通过变量获取)
  5. 虹科茵赛飞3D_Analyzer:高级的3D CAD 查看器
  6. C++程序调试方法:
  7. 使用springmvc时报错JSPs only permit GET POST or HEAD
  8. python减法报错_python – numpy FloatingPointError:减法中遇到的值无效 – 不可重现?...
  9. Lowest Common Ancestor问题的解决思路
  10. 不能以“一时一事”来衡量转型,灿谷的方向是对的