當前位置:首頁 » 編程語言 » redis隊列php

redis隊列php

發布時間: 2022-05-06 10:38:30

1. php 後台怎麼開一個進程監聽Redis的隊列消息呢用while

redis的subscribe用pconnect鏈接,執行這個腳本的進程會自動監聽所訂閱的頻道發送的消息

ini_set(『default_socket_timeout』, -1);

$redis = new \Redis();
$redis->pconnect('127.0.0.1', 6379);

//訂閱
$redis->subscribe(['msg'], 'callfun');

function callfun($redis, $channel, $msg)
{
var_mp([
'redis' => $redis,
'channel' => $channel,
'msg' => $msg
]);
}

2. 如何使用Redis 做隊列操作

  • redis設計用來做緩存的,但是由於它自身的某種特性使得它可以用來做消息隊列,它有幾個阻塞式的API可以使用,正是這些阻塞式的API讓其有能力做消息隊列;

  • 另外,做消息隊列的其他特性例如FIFO(先入先出)也很容易實現,只需要一個list對象從頭取數據,從尾部塞數據即可;

  • redis能做消息隊列還得益於其list對象blpop brpop介面以及Pub/Sub(發布/訂閱)的某些介面,它們都是阻塞版的,所以可以用來做消息隊列。

3. php怎麼實現redis阻塞隊列

具體的業務還是得需要你自己定製。你的需求實際上是一個變形的生產者-消費者實現。對於此類需求,主要是將請求和實際的處理過程解耦,一般都是採取非同步的方式來通知請求方,這跟用不用redis其實沒有多大的關系。一般的實現方法是你需要將用戶的請求封裝成一個Task,然後將這個Task再push到redis隊列,然後後端的worker.php完全可以多進程、多線程的並發處理Task並將處理結果回調給請求方。這里唯一麻煩點的就是這個Task的設計,需要能夠包含請求信息(請求內容,請求方標識等等).

4. 請教PHP+Redis實現任務隊列的思路

// 創建請求ID標志, uniqid 無法保證唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超時策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(後)插入隊列

// 堵塞等待隊列中第一個和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超時跳出(某些原因隊列異常了, 可能永遠取不到)
}
usleep(10); // sleep 10ms, 再次嘗試
}

// 這里執行任務的處理代碼....

// $response 已拼裝好要返回的內容
// 處理完成後(資料庫等已入庫更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次確認第一個是本請求
$redis->lPop($tsk_name); // 完成任務了, 從隊列中移除
}else{
// 出現這種情況, 是因為超時了, 或前面的$uuid沒有被消費
// 若不清除, 後續的請求, 都將無法正常進入隊列執行
// 取隊列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){

5. 如何正確使用redis隊列處理php秒殺並發問題

1. redis中保存的是數組(序列化),絕對不要保存sql,保存SQL的方法很蛋疼 保存數組是為了資料庫安全(萬一sql語句有錯誤,任務就直接失敗了),靈活度和兼容性
2.伺服器後台作一個shell腳本,死循環,不斷從隊列中取數據,進行處理.如次反復,如果沒有數據,也立即嘗試取數據---不要擔心性能問題,後台單並發請求,不會造成性能問題
3.因為隊列中保存的是數組,不存在這個問題

6. php redis 消息隊列 一次出多少個隊列

方法如下:
[php] view plain print?

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
while(1){
try{
$value = "value_".time();
$redis->LPUSH('key1', $value);
echo $value."\n";
sleep(rand(1, 3));
}catch(Exception $e){
echo $e->getMessage(). "\n";
exit;
}
}

熱點內容
如何在別人的伺服器加模組 發布:2024-05-20 21:28:29 瀏覽:60
伺服器的bios晶元電腦店有嗎 發布:2024-05-20 21:28:26 瀏覽:223
剪輯電影什麼配置 發布:2024-05-20 21:25:17 瀏覽:818
解壓神器中的詭異事件 發布:2024-05-20 21:17:59 瀏覽:7
星火草原系統源碼 發布:2024-05-20 21:12:44 瀏覽:767
c編譯器手機版中文版下載 發布:2024-05-20 21:11:56 瀏覽:777
存儲超融合 發布:2024-05-20 21:07:24 瀏覽:455
孩子培訓編程 發布:2024-05-20 21:05:57 瀏覽:455
linux伺服器源碼 發布:2024-05-20 21:05:00 瀏覽:400
javaread 發布:2024-05-20 20:51:52 瀏覽:789