摘要:解决高并发瓶颈解决红包程序本程序模拟的红包抽奖模式。总金额元,随机用户获得元的红包,直到红包分发完。
解决高并发 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多线程测试
</>复制代码
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元 |
推荐:
100万个openid快速存入redis
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26276.html
摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...
摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...
摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...
阅读 765·2021-09-24 09:48
阅读 2530·2021-08-26 14:14
阅读 604·2019-08-30 13:08
阅读 1486·2019-08-29 15:22
阅读 3130·2019-08-29 11:06
阅读 1040·2019-08-26 18:26
阅读 1168·2019-08-26 13:53
阅读 2639·2019-08-26 12:21