久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

redis能不能用來做消息隊列

186次閱讀
沒有評論

共計 2451 個字符,預計需要花費 7 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要介紹了 redis 能不能用來做消息隊列,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓丸趣 TV 小編帶著大家一起了解一下。

應用場景:

例如秒殺。瞬時大量寫入訂單到數據庫,導致數據庫無法及時響應。此時可以采用 Redis 做消息隊列,把所有需要寫入的數據先寫入 Redis 消息隊列中,然后同時在服務器開啟 php-cli 進程循環讀取隊列中的數據,異步寫入數據庫。使用 redis 做消息隊列可能會出現消息丟失的情況,因為沒有消息接收的確認機制。大型程序,應該使用類似 RabitMQ 來做專業消息隊列。

1、使用 publish/subscribe 方式作為消息隊列

特點:一個消息發布者(生產者),可以對應多個消息訂閱者(消費者)。當消息發布到消息隊列的時候,所有消息訂閱者都可以收到消息。適用于分布式消息分發。client 以阻塞的方式等待 publish 端的消息。多個消費者不能加快消息消費速度。

消息生產:

$params =json_encode([x_uid = $x_uid, phone = $phone]);
$redis- publish(test ,$params); //test 表示發布的頻道名字 

消息消費(php-cli 模式運行):

$redis = new Redis(); $redis- pconnect( 127.0.0.1 // 必須用 pconnect 長連接
// 設置 redis 連接永遠不超時。默認 60s 超時斷開連接 $redis- setOption(Redis::OPT_READ_TIMEOUT, -1);
$redis- subscribe(array( test), callback //test 表示頻道名字,callback 回調函數名
functioncallback($redis, $chan, $msg){ // 對收到的消息進行處理函數
$params = json_decode($msg,true);
}

pconnect 和 connect 區別:

connect:腳本結束之后連接就釋放了。

pconnect:腳本結束之后連接不釋放,連接保持在 php-fpm 進程中。

所以使用 pconnect 代替 connect,可以減少頻繁建立 redis 連接的消耗。

2、使用 list 作為 redis 消息隊列

特點:一個消息生產者,對應一個消息消費者。多個消費者可以加快消息消費速度。

消息生產:

$redis =newRedis();
$redis- connect( 127.0.0.1 
// 將需要寫入數據庫的數據全部 push 到隊列(復雜數據可以先 json 編碼成字符串)$list = json_encode([ x_uid = $x_uid, phone = $phone, goods_id = $goodsId, 
 add_time = time(), num_field = $num_field]);
$redis- lpush(winer ,$list);

注意:brpop 消費數據如果沒有成功寫入數據庫,會導致數據丟失。強烈要求生產數據時,二次備份到 redis 或文件中。

消息消費(php-cli 模式運行):

注意:MySQL 不主動關閉連接的情況下,一次連接最長八小時后自動斷開。

?php
// 鏈接數據庫
$conn = mysqli_connect( localhost , root , root 
if(!$conn){die( 連接數據庫失敗:. mysqli_error());
mysqli_select_db($conn, api 
// 字符轉換,讀庫
mysqli_query($conn, set character set utf8 
mysqli_query($conn, set names utf8 
// 連接本地的 Redis 服務
$redis =newRedis();
$redis- connect(127.0.0.1 ,6379);
// 設置 redis 連接永遠不超時。默認 60s 超時斷開連接
$redis- setOption(Redis::OPT_READ_TIMEOUT,-1);
echo Listening... 
$i =1;
while(true){$data = $redis- brpop( winer ,0); // 0 表示沒有接收到參數的情況下,永遠不超時斷開
$info = json_decode($data[1],true);
$x_uid = $info[ x_uid 
$phone = $info[ phone 
$goods_id = $info[ goods_id 
$add_time = $info[ add_time 
$num_field = $info[ num_field 
// 將數組寫入數據庫、訂單
$sql = insert into hd_hengda11_order (`x_uid`,`phone`,`goods_id`,`add_time`) 
values ($x_uid,$phone,$goods_id,$add_time) 
$re = mysqli_query($conn,$sql);
echo $i. _ok|| 
$i++;
?

其他:

秒殺場景防止商品超賣:

1、數據庫中設置商品數量為無符號型,即不允許負數。當更新商品數量到負數時,返回 false。

2、商品數量存在 Redis 的 list 隊列中,每次搶購就 pop 刪除一個元素出隊列。

// 存放商品數量的隊列
for($j =1; $j $j++){ / 設置商品數量為 10
$re =Redis::lpush(gooods_count,1);
}

判斷商品數量邏輯

$count=Redis::lpop( gooods_count 
//$count = Redis::llen( gooods_count //llen 判斷隊列長度
if(!$count){return 已經搶光了哦}

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享 redis 能不能用來做消息隊列內容對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,遇到問題就找丸趣 TV,詳細的解決方法等著你來學習!

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2024-02-03發表,共計2451字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 邯郸市| 恩施市| 南丰县| 江阴市| 土默特右旗| 常山县| 大邑县| 公安县| 绥滨县| 丹寨县| 南阳市| 互助| 什邡市| 清河县| 吉水县| 岚皋县| 余江县| 荃湾区| 樟树市| 宁海县| 溆浦县| 宜良县| 九龙城区| 虹口区| 敦化市| 衡东县| 博爱县| 惠州市| 甘德县| 阿巴嘎旗| 浦北县| 唐河县| 临江市| 垣曲县| 大新县| 阜新市| 泾阳县| 保山市| 桦川县| 绥宁县| 丰原市|