最近公司这里要配合支付宝做一个秒杀系统,于是查了相关的资料,
秒杀系统的问题
1)短时间内服务负载高
2)高并发超卖的问题

百度搜索的结果
下面的方法都使用redis即代码

  1. $redis = new \Redis();
  2.  
  3. if ($redis->connect('127.0.0.1','6379') == false) {
  4. die($redis->getLastError());
  5. }

①使用redis的原子性操作,保证不多抢

  1. if($_GET['flag']){
  2. $redis->set('flag',10);exit;
  3. }
  4.  
  5. $key_r = $redis->decr('flag');//利用redis的原子性操作,保证不多抢
  6. if ($key_r < 0) {
  7.  
  8. } else {
  9. //抢到了
  10. $value="test".rand("1","20");
  11. $redis->zAdd('demo',$redis->get('flag'),$value);
  12. $rs=$redis->zRange('demo',0,-1);
  13. //print_r($key_r);
  14. if(count($rs)+$key_r<10){
  15. $redis->set('flag',$key_r+1);
  16. }
  17. }

②先把商品放到队列,减队列的方式

  1. if($_GET){
  2. $store=10;
  3. $res=$redis->llen('goods_store');
  4. echo $res;
  5. $count=$store-$res;
  6. for($i=0;$i<$count;$i++){
  7. $redis->lpush('goods_store',1);
  8. }
  9. $redis->set('flag',10);
  10. exit;
  11. }
  12.  
  13.  
  14. $count=$redis->lpop('goods_store');
  15. if(!$count){
  16. insertLog('error:no store redis');
  17. return;
  18. }else{
  19. $value="test".rand("1","20");
  20. $redis->zAdd('demo',$redis->get('flag'),$value);
  21. }

③慕课网看视频提供的方法

  1. if(!$redis->get('flag')){
  2. $redis->set('flag',1);
  3. }
  4.  
  5. $value="test".rand("1","20");
  6. if($redis->get('flag')>10){
  7.  
  8.  
  9. }else{
  10.  
  11. if($redis->zAdd('demo',$redis->get('flag'),$value)){
  12. $redis->incr("flag");
  13. }
  14. }

上面的方法都用办法测试过

  1. ab -n 1000 -c 1000 http://127.0.0.1/redis.php

都有问题
②③都出现超卖的情况
① 不会出现超卖会出现少买的情况

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!