当前位置:   article > 正文

thinkphp3+redis实现并发处理_tp3.2使用redis队列技术

tp3.2使用redis队列技术

基本思路是所有操作用过redis的队列和集合处理并发

1.用户抢购队列(List),user_list

2.商品队列(List),goods_list

3.订单信息(Hash集合),order_info

4.购买成功用户(Set集合),bought_list

PS:1和2用来控制并发,队列的rPop是具有原子性的,即使处理并发,也是一个个处理,不会出现重复和超卖的情况。

3则是用来暂时存放订单信息,之后再入库。

4是为了防止用户重复购买做的(Set的特性是不能重复)。

 

并发模拟则是在Linux的webbench做的。

经过试验发现,并发1000条的抢购,直接操作数据库要12秒,使用redis只要6秒,速度快了整整一倍!

 

下面贴源码

商品入货1000个:

 

  1. public function ruhuo(){
  2. $redis = new \redis();
  3. $redis->connect('127.0.0.1', 6379);
  4. for($i = 1;$i<=1000;$i++)
  5. $redis->lpush('goods_list',$i);
  6. echo '进货成功';
  7. }

 

秒杀接口:

  1. public function redis_qianghuo(){
  2. $redis = new \redis();
  3. $redis->connect('127.0.0.1', 6379);
  4. //查询库存
  5. if($redis->lLen('goods_list') == 0)
  6. $this->ajaxReturn('商品已售完...');
  7. $uid = session('uid');
  8. //查询是否购买过
  9. if($redis->sIsMember('bought_list',$uid))
  10. $this->ajaxReturn('你已经购买过了!');
  11. $goods_id = $redis->rpop('goods_list');
  12. $redis->sAdd('bought_list',$uid);
  13. $value = array(
  14. 'uid' => $uid,
  15. 'goods_id' => $goods_id,
  16. 'time' => time(),
  17. );
  18. $redis->hSet('order_info',$uid,json_encode($value));
  19. $this->ajaxReturn('购买成功。');
  20. }

就是这么简单,不仅高效,而且不会出现超卖情况,很实用的并发处理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/257724
推荐阅读
相关标签
  

闽ICP备14008679号