1. 程式人生 > >php+redis實現消息隊列

php+redis實現消息隊列

blog 建立 保存 tps 9.png 失敗 定時任務 應用 流量

參考: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

php+redis實現消息隊列