人人人妻人人人妻人人人,99精品国产综合久久久久五月天 ,欧美白人最猛性XXXXX,日韩AV无码免费播放

News新聞

業(yè)界新聞動態(tài)、技術前沿
Who are we?

您的位置:首頁      樂道系統(tǒng)FAQ      PHP實現(xiàn)電商訂單自動確認收貨redis隊列

PHP實現(xiàn)電商訂單自動確認收貨redis隊列

標簽: 發(fā)布日期:2017-05-17 00:00:00 236

一、場景

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

二、思路

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

redis隊列的生產者

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

$successCount=0;
$failCount=0;
$screen_time = 3600*24*9;//設置篩選天數(shù)
$data = array();
$now_time = time();
//查詢符合要求的數(shù)據(jù)
$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);
//當隊列還有數(shù)據(jù)時將數(shù)據(jù)記錄并清除
while($redis->LLEN('auto_recevice_order')){
$txt = '執(zhí)行時間:'.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++;
}
//重新填充數(shù)據(jù)進隊列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH('auto_recevice_order',json_encode($row1));
}
 $con->close();
 $success=date('Y-m-d H:i:s').':[推送成功]:本次成功推送數(shù)據(jù):'.$successCount.'條;記錄上次處理失敗數(shù)據(jù):'.$failCount."條\r\n";
 file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);