久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP實現電商訂單自動確認收貨redis隊列

下面小編就為大家帶來一篇PHP實現電商訂單自動確認收貨redis隊列。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、場景

之前做的電商平臺,用戶在收到貨之后,大部分都不會主動的點擊確認收貨,導致給商家結款的時候,商家各種投訴,于是就根據需求,要做一個訂單在發貨之后的x天自動確認收貨。所謂的訂單自動確認收貨,就是在在特定的時間,執行一條update語句,改變訂單的狀態。

二、思路

最笨重的做法,通過linux后臺定時任務,查詢符合條件的訂單,然后update。最理想情況下,如果每分鐘都有需要update的訂單,這種方式也還行。奈何平臺太小,以及賣家發貨時間大部分也是密集的,不會分散在24小時的每分鐘。那么,定時任務的話,查詢過多,不適合。這里可以先把將要自動確認收貨的訂單信息存儲到其他介質上,比如redis,memcache,rabbitmq,然后執行的腳本從前面的介質獲取到訂單信息來判斷,這里可以大大的減少數據庫的查詢壓力。

redis隊列的生產者

對此,我們選擇每天在凌晨兩點的時候,通過linux的定時任務把即將要確認收貨的訂單信息查詢出來,然后存儲在redis上,redis上我們選擇的隊列,隊列處理的特點就是先進先出,前面的數據在查詢訂單時,通過發貨時間排序,所以最先出隊列的肯定是距離規定的自動收貨時間最近的訂單。代碼如下

$successCount=0;
$failCount=0;
$screen_time = 3600*24*9;//設置篩選天數
$data = array();
$now_time = time();
//查詢符合要求的數據
$sql="select id,send_time as deliver_time from `order` where is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time>0 and send_time + {$screen_time} < $now_time
order by send_time asc";
$res = $con->query($sql);
//當隊列還有數據時將數據記錄并清除
while($redis->LLEN('auto_recevice_order')){
$txt = '執行時間:'.date('Y-m-d H:i:s').',信息:'.$redis->RPOP('auto_recevice_order');
file_put_contents('./autoToken/fail_log.txt',$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充數據進隊列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH('auto_recevice_order',json_encode($row1));
}
 $con->close();
 $success=date('Y-m-d H:i:s').':[推送成功]:本次成功推送數據:'.$successCount.'條;記錄上次處理失敗數據:'.$failCount."條\r\n";
 file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);

redis隊列的消費者

隊列的消費者沒有通過linux的定時任務去做,用linux的screen+php cli模式執行php腳本,消費者只需要不斷的從隊列中讀取訂單信息,然后判斷訂單信息中的發貨時間,如果達到自動收貨的要求,就執行update語句。同時如果沒有達到收貨的時間,而且與收貨時間間距比較大的時候,可以讓php腳本休眠sleep一定的時間數,這個時間數自己調節設計,獲取出來的未達到時間要求的訂單,需要重新推送到redis隊列中去,而且還是隊列的頂端。以便下次獲取。代碼如下:

$set_time = 3600*24*10;//設置幾天后自動收貨
while(true){
if($i%30==0){
usleep(10);//防止while 循環使CPU使用率過高
}
if($redis->LLEN('auto_recevice_order')){
$data = json_decode($redis->RPOP('auto_recevice_order'));
$id = (int)$data->id;//將數據轉化為整形
$deliver_time = (int)$data->deliver_time;//將數據轉化為整形
$res1 = $res2 =false;
$now_time = time();
if(($deliver_time+$set_time)<$now_time){
 $sql1 = "update `order` set `is_token`='1',`token_time` = $now_time where id=$id and is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time + {$set_time} < $now_time";
 $res1 = $con->query($sql1);//更新數據
$rows = mysqli_affected_rows($con);
if($rows){
 $ip = $this->getIp();
 $sql2 = "insert into `order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`) VALUES($id,'系統自動收貨','$ip','系統','服務器','收貨',$now_time)";//寫入訂單日志
 $res2 = $con->query($sql2);//添加日志數據
 }
 }
 if($res1==false){//將沒達到條件的數據重新插入隊列中
  $redis->RPUSH('auto_recevice_order',json_encode(array('id'=>$id,'deliver_time'=>$deliver_time)));
 }
}
 $i++;
}

這里執行php腳本,需要用到linux的screen或者supervisor、nohup守護進程。具體用法可自行百度.同樣腳本里面最好有必須的日志記錄。

三、思考

隨著業務的增長,在隊列中同一秒內,存在的多個需要處理的訂單,而一次只能從隊列中取出一個相關訂單信息的時候,可以采用一個生產者多個消費者的模式,這種情況下,可以用到鎖機制,保證一條消息只能到達一個消費者。當redis數據達到一定的量之后,也可以適當的調整生產者的執行頻率和對應的條件。

以上這篇PHP實現電商訂單自動確認收貨redis隊列就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 黄篇网址 | 欧美日韩视频在线 | 神马久久久久久久久久 | 黄网站在线播放 | 亚洲人成在线播放 | 91久久国产综合久久91精品网站 | 日韩在线观看视频一区 | 精品国产一区二区三区久久久久久 | 一区影院| 亚洲在线视频 | 久久草视频 | 91在线视频免费观看 | 国产欧美在线视频 | 成人不卡视频 | 国产欧美一区二区三区在线看蜜臀 | 久久香蕉网 | 欧美激情精品久久久久久 | 日本久久久久久 | 久久久亚洲一区 | 在线观看中文字幕一区二区 | 欧美一级片在线看 | 欧美v片| 免费观看黄色片视频 | 日日干日日色 | 亚洲最新在线视频 | 一级欧美| 人人干视频在线 | 人人人干| 日韩午夜一区二区三区 | 日日夜夜精品视频 | 久久久91精品国产一区二区三区 | 91.色| 国产精品高潮呻吟久久 | 精品欧美一区二区在线观看欧美熟 | 久久免费精品视频 | 在线国产中文字幕 | 国产精品一区久久久 | 在线一区视频 | 国产偷自视频区视频 | 91偷拍精品一区二区三区 | 黄色网址在线播放 |