分享

抽奖 抢购 秒杀

 井梅 2018-09-25

一、对数据库产生压力

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.              高并发分流

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多