背景:
做商品支付的開發(fā)過(guò)程中,一個(gè)必須考慮到的環(huán)節(jié):用戶在點(diǎn)擊下單購(gòu)買,同時(shí)也點(diǎn)擊了支付,這時(shí)候由于各種原因,用戶長(zhǎng)時(shí)間未支付,對(duì)于庫(kù)存有限的商品來(lái)說(shuō),一般會(huì)將當(dāng)前訂單的商品庫(kù)存鎖定一段時(shí)間,這段時(shí)間一過(guò),還未支付,庫(kù)存自動(dòng)回庫(kù),同時(shí)修改支付狀態(tài),可以參照下12306的買票過(guò)程,對(duì)于這樣一種需求,我們有什么開發(fā)成本低的方案呢?
方案:
如果你的后端是java開發(fā)的,那搞個(gè)schedule定時(shí)任務(wù)到時(shí)間了去查一下是否支付成功,如果沒(méi)有支付,回庫(kù),改狀態(tài),也比較簡(jiǎn)單。
如果后端是php開發(fā)的呢,php搞不了多線程啊,只能linux開crontab 任務(wù)了,寫個(gè)php腳本,定時(shí)掃訂單吧。
今天提供的一種思路是利用redis的過(guò)期機(jī)制,以及過(guò)期回調(diào)來(lái)實(shí)現(xiàn)這個(gè)功能,對(duì)redis底層的操作封裝,java,php都有支持
已下以php為例簡(jiǎn)要介紹實(shí)現(xiàn)方法
redis的過(guò)期回調(diào)這個(gè)功能很關(guān)鍵,需要在redis.conf中開啟配置
notify-keyspace-events "Ex"
php擴(kuò)展redis.php已經(jīng)封裝好了回調(diào)方法
public function psubscribe( $patterns, $callback ) {}
調(diào)用:
$redis_xx->psubscribe(array('__keyevent@0__:expired'), 'psCallback');
function psCallback($redis_xx, $pattern, $chan, $msg){
? ? $msg 為你設(shè)置的key,可以傳訂單ID過(guò)來(lái),回調(diào)的時(shí)候用訂單ID去查詢付款狀態(tài),同時(shí)判斷是否需要庫(kù)存回庫(kù)
}
這個(gè)回調(diào)監(jiān)聽(tīng)的腳本需要一直運(yùn)行在后端的,否則redis的key過(guò)期后是無(wú)法通知到的,也就無(wú)法調(diào)用你的回調(diào)方法,我們可以用linux提供的命令 nohup xxx.php & 當(dāng)前腳本回轉(zhuǎn)到后端以進(jìn)程方式運(yùn)行,同時(shí)回生成一個(gè)叫nohup.out的文件用來(lái)記錄日志,至此我們的方案介紹完畢
最近上架了款微信小游戲,歡迎大家來(lái)體驗(yàn),多多提意見(jiàn),微信掃一掃下面小程序碼即可體驗(yàn)
