抽奖-抢购-秒杀解决方案分析
对数据库产生压力
apache自带测试压力工具 ab -c 250 -n 600
250表示并发数
600表示请求数
竞争状态下-->库存的正确减少(超卖)
产生原因:
mysql速度问题
没有对抢购做限制,监视
前端方案:缓存 扩容 流量限制
解决方案
1.文件锁->共享锁(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);
2.使用消息队列redis
快的原因:mysql是磁盘比缓存慢的多 单线程 非关系型
使用生产者消费模式-->1,多个
1)发布订阅者模式
$redis=new Redis;
$result=$redis->connect('127.0.0.1','6379');
foreach($ids as $id){
$redis->lPush('send_list',$id);
}
2)乐观锁(监听销量)
$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
//永久执行
//守护进程
分布式集群服务器--一个或者多个队列服务器
分布式缓存
分布式RPC
消息中间件
高并发分流