marty001 发表于 2017-12-21 17:09:11

php+redis实现消息队列

  参考:http://www.cnblogs.com/lisqiong/p/6039460.html
  参考:http://blog.csdn.net/shaobingj126/article/details/50585035
  消息队列:是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它
  应用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景
  1、异步处理
  场景说明:用户注册后,需要发注册邮件和注册短信。

  注解:自行考虑ajax中的异步。
  2、应用解耦
  一般订单系统和库存系统是一体的,但是如果一方出现问题,那么这个订单就失败了。



[*]订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
[*]库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
[*]假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
  注解:感觉特别像行为驱动,消息队列中存储的就是每个行为
  3、流量消锋(一般在秒杀或团抢活动中使用广泛)

  注解:一般秒杀时订单会特别的多,但是数据库无法一次性的处理这么多,所以可以先存在消息队列中,无论我进的速度多快,出的速度都是一定的。不知道算不算属于漏斗模型的一部分
  php的redis扩展:https://github.com/phpredis/phpredis
  1)redis函数rpush,lpop
  2).Linux的crontab
  创建demo.php和index.php
  

<?php  

  

$redis = new Redis();  

$redis->connect('127.0.0.1',6379);  

$password = '123456';  

$redis->auth($password);  

$arr = array('h','e','l','l','o','w','o','r','l','d');  

foreach($arr as $k=>$v){$redis->rpush("mylist",$v);  
}
  

  

<?php  

$redis = new Redis();  

$redis->connect('127.0.0.1',6379);  

$password = '123456';  

$redis->auth($password);  

//list类型出队操作  
$value = $redis->lpop('mylist');
  
if($value){
  echo "出队的值".$value;
  
}else{
  echo "出队完成";
  
}
  
?>
  

  建立定时任务
  */1 * * * * root php /wwwroot/workplace/redis/index.php
  */3 * * * * root php /wwwroot/workplace/redis/demo.php
页: [1]
查看完整版本: php+redis实现消息队列