一、对数据库产生压力 1.
apache自带测试压力工具 ab
-c 250 -n 600 1)
250表示并发数 2)
600表示请求数 2.
竞争状态下-->库存的正确减少(超卖) 3.
产生原因: 1)
mysql速度问题 2)
没有对抢购做限制,监视 3)
前端方案:缓存
扩容 流量限制 4)
解决方案 a)
文件锁->共享锁(LOCK_SH),排它锁(LOCK_EX) $lockFile='lock.lock'; if(file_exists($lockFile)){ if(time()-filemtime($lockFile)
> 600){ unlink($lockFile); } } //两种情况(flock) 阻塞模式 非阻塞模式 $fp=fopen('lock.txt','W+'); if(flock($fp,LOCK_EX)){ //处理订单 flock($fp,LOCK_UN); } fclose($fp); b)
使用消息队列redis
i.
快的原因:mysql是磁盘比缓存慢的多
单线程 非关系型
ii.
使用生产者消费模式-->1,多个
iii.
发布订阅者模式 $redis=new Redis; $result=$redis->connect('127.0.0.1','6379'); foreach($ids as $id){ $redis->lPush('send_list',$id); }
iv.
乐观锁(监听销量) $redis=new
Redis; $redis->connect('127.0.0.1','6379') $redis->watch('count'); $count=$redis->get('count'); $num=2 if($count>=$num){ exit('活动结束'); } $redis->multi();//开启事务之后才会将命令放入到队列中,不执行 $redis->set('count',$count+1); sleep(1); $res=$redis->exec();//按命令放入先后顺序执行,如果监视的数据被修改,则执行命令失败 set watch get //永久执行 //守护进程 c)
分布式集群服务器--一个或者多个队列服务器
i.
分布式缓存
ii.
分布式RPC
iii.
消息中间件 iv. 高并发分流 |
|