PHP中利用redis实现消息队列处理高并发请求思路详解

广告位招租
扫码页面底部二维码联系

在电商活动中,常常会出现高并发的情况,例【转载请注明来源】未经授权,禁止复制转载。如很多人同时点击购买按钮,以至于购买人数【版权所有,侵权必究】未经授权,禁止复制转载。超出了库存量,这是一种非常不理想的状况,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。因此,我们在PHP开发中就会引入消息队列转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。来解决这种高并发的问题。

【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】

思路一览:转载请注明出处:www.tangshuang.net

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【原创不易,请尊重版权】

当用户点击按钮提交购买请求时,并不直接马本文作者:唐霜,转载请注明出处。【未经授权禁止转载】上执行购买请求动作,而是将请求动作存入消【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】息列队,用户的请求到此结束,而在服务器后本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。台,从消息列队中逐一取出请求记录,再进行【转载请注明来源】本文版权归作者所有,未经授权不得转载。数据库操作,完成处理之后,将处理结果返回转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】给用户。由于消息队列的存取是先进先出(和原创内容,盗版必究。原创内容,盗版必究。栈相反),因此,所有处理将按请求顺序进行著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。处理。由于处理是在后台一个一个完成,因此【转载请注明来源】未经授权,禁止复制转载。不会对服务器和数据库造成巨大压力。

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。
【本文首发于唐霜的博客】未经授权,禁止复制转载。原创内容,盗版必究。【作者:唐霜】本文版权归作者所有,未经授权不得转载。

接下来我们来看下具体的一个实现流程是怎样著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】的。

【转载请注明来源】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】

将请求存入redis【版权所有,侵权必究】

【未经授权禁止转载】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

当用户点击按钮时,我们通过ajax将请求【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net发给php进行处理,前台返回给用户正在处转载请注明出处:www.tangshuang.net【版权所有,侵权必究】理的提示(当然,这种提示让设计师设计出让【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】用户满意的效果)。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
try {
  $redis->LPUSH('click',$user_id);
}
catch(Exception $e) {
  echo $e->getMessage();
}

在后台进行数据处理本文作者:唐霜,转载请注明出处。

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。

守护进程【原创内容,转载请注明出处】

【作者:唐霜】【本文受版权保护】著作权归作者所有,禁止商业用途转载。

当上述请求存入redis后,就可以直接将【本文受版权保护】【转载请注明来源】结果返回给用户了。我们需要在服务端创建一【原创内容,转载请注明出处】【版权所有,侵权必究】个后台运行的程序,从redis中取出请求本文作者:唐霜,转载请注明出处。【本文受版权保护】数据,并利用这些数据读取和更新数据库。但转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。是这一切都是后台运行解决的,而非用户请求【转载请注明来源】【作者:唐霜】触发的。

【作者:唐霜】原创内容,盗版必究。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。

从redis中将请求取出【版权所有】唐霜 www.tangshuang.net

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。原创内容,盗版必究。

通过上面的代码,redis中会存储很多请【原创内容,转载请注明出处】【原创不易,请尊重版权】求,这些请求都是准备用来处理的。这个列队转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。已经存在了之后,再服务器后台,则对这些请【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。求进行处理,第一步就是先从redis中逐【本文受版权保护】原创内容,盗版必究。一取出请求。

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
while(1) {
  try{
    $value = $redis->LPOP('click');
    /**
      利用$value进行逻辑和数据处理
     */
  }
  catch(Exception $e) {
    echo $e->getMessage();
  }
}

数据处理:长连接与事件未经授权,禁止复制转载。

【本文受版权保护】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。

为了保证数据处理正常进行,必须和数据库之本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。间建立长连接,因此上面我们采用了pcon著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netnect。在于mysql连接时,也要采用未经授权,禁止复制转载。【作者:唐霜】长连接,保证数据处理的有效性。同时,由于著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】在后台运行,我们不可能随时获取数据库操作【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】的状态,因此,我们最好采用innodb引【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】擎,对数据库操作事件进行监听,如果出现了著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】异常,要对事件结果进行检查,如果数据插入【原创内容,转载请注明出处】【版权所有,侵权必究】失败,应该重新执行该事件。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【本文受版权保护】

2015-08-19 28959

为价值买单,打赏一杯咖啡

本文价值289.59RMB