关于高并发的处理

  1. 1. 关于库存和秒杀的解决方案

用同步队列,就可以实现。库存比如是1000,那就存1000个随机数到队列中,拿到随机数的人去换取真实的商品。这样数据库的压力都小。最多更新1000次。队列可以系统加载时创建,也可以做为持久化保存在文件中。

关于库存和秒杀的解决方案

  1. 用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑。
  2. 根据update结果来判断,我们可以加一个判断条件update … where 库存>0,如果返回false,则说明库存不足,并回滚事务。
  3. 借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户”服务器繁忙”
1
2
3
4
5
6
7
8
9
//阻塞(等待)模式
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//非阻塞模式
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
//..处理订单
flock($fp,LOCK_UN);
}
else
{
echo "系统繁忙,请稍后再试";
}
fclose($fp);
//采用哪种方式,看并发数量吧。