鍍金池/ 問答/PHP  數(shù)據(jù)庫/ php mysql 訂單消息

php mysql 訂單消息

我現(xiàn)在要查詢未支付的訂單然后發(fā)送消息通知
消息通知規(guī)則:
1:30分鐘未支付的訂單發(fā)送一個(gè)消息通知 記錄這個(gè)時(shí)間點(diǎn)
2:根據(jù)上個(gè)時(shí)間點(diǎn) + 2天 如果還是未支付 那么在給用戶發(fā)送一條消息通知
備注:一個(gè)用戶最多2條消息通知


訂單表

  • order_sn (訂單編號(hào))
  • user_id(用戶的id)
  • add_time (訂單編號(hào))
  • order_sn (下單時(shí)間)
  • pay_status(支付狀態(tài)(1:未支付2:支付成功 3:支付失敗) )
  • msg_count (發(fā)送的消息通知個(gè)數(shù))

現(xiàn)在的問題是 如何查詢 30分鐘未支付的訂單 ? 如何查詢上個(gè)時(shí)間點(diǎn)+2天的訂單我現(xiàn)在考慮的是在新建一張發(fā)送消息通知的數(shù)據(jù)表
表結(jié)構(gòu)如下:

  • user_id (用戶的編號(hào))
  • add_time (發(fā)送消息的時(shí)間)

如何更高效查詢數(shù)據(jù)呢? 現(xiàn)在就是查詢數(shù)據(jù)這塊

回答
編輯回答
避風(fēng)港

使用DelayQueue

DelayQueue能做什么?
在我們的業(yè)務(wù)中通常會(huì)有一些需求是這樣的:

  1. 淘寶訂單業(yè)務(wù):下單之后如果三十分鐘之內(nèi)沒有付款就自動(dòng)取消訂單。
  2. 餓了嗎訂餐通知:下單成功后60s之后給用戶發(fā)送短信通知。

那么這類業(yè)務(wù)我們可以總結(jié)出一個(gè)特點(diǎn):需要延遲工作。
由此的情況,就是我們的DelayQueue應(yīng)用需求的產(chǎn)生。
給你個(gè)鏈接 http://blog.csdn.net/u0110017... 不過這是JAVA的 不知道PHP 是什么

2017年8月12日 17:18
編輯回答
糖豆豆

要考慮的因素其實(shí)挺多的:

  1. 數(shù)據(jù)量、按時(shí)支付的比例
  2. 定時(shí)的處理(每隔多長時(shí)間去判斷未支付,用什么方式定時(shí))
  3. 發(fā)消息(用什么方式發(fā)通知?郵件還是短信?會(huì)影響處理能力)

如果拋開這些,僅僅是查詢到期未支持訂單,按你的數(shù)據(jù)結(jié)構(gòu),要查詢下單30分鐘未支付其實(shí)很簡單,就是下單時(shí)間在當(dāng)前時(shí)間30分鐘前,且未支付的(再加上未發(fā)送過通知的)。建好索引一般不會(huì)有什么問題。

如果數(shù)據(jù)量不大,可以把發(fā)送消息的時(shí)間放到第一張表
那第一次發(fā)消息的條件就是“支付時(shí)間在30分鐘前 且 未支付 且 未發(fā)送通知”
第二次發(fā)消息的條件是“未支付 且 已發(fā)送通知 且 上次發(fā)送通知是兩天前”

2017年5月29日 00:41
編輯回答
薄荷綠

這個(gè)其實(shí)很好處理的,就是根據(jù)時(shí)間判斷,用當(dāng)前時(shí)間-未支付的訂單的創(chuàng)建時(shí)間,如果大于30分鐘就發(fā)送消息;同理當(dāng)前時(shí)間-未支付的訂單的創(chuàng)建時(shí)間大于2天就發(fā)送消息;每次發(fā)送的時(shí)候用你的msg_count記錄一下.這樣子就ok了.

2018年3月16日 09:00
編輯回答
不歸路

題主可以了解一下消息隊(duì)列的概念,順便推薦一下rabbitMQ。

2018年8月31日 09:51