訂單自動過期實現方案 - 轉
轉 https://blog.csdn.net/qq_26360877/article/details/106184296
需求分析:24小時內未支付的訂單過期失效。
解決方案
- 被動設定:在查詢訂單的時候檢查是否過期並設定過期狀態。
- 定時排程:定時器定時查詢並過期需要過期的訂單。
- 延時佇列:將未支付的訂單放入一個延時佇列中,依次取出過期訂單。
- 過期提醒:reids支援將一個過期的key(訂單號)通知給客戶端,根據過期的訂單號進行相應的處理。
被動設定:
就是在查詢的時候判斷是否失效,如果失效了就給他設定失效狀態
定時排程:
利用一個定時器,在設定的週期內輪詢檢查並處理需要過期的訂單。
具體實現有基於Timer
的,有基於Quartz
,還有springboot自帶的Scheduler
缺點:
(1)不能夠精準的去處理過期訂單,輪詢週期設定的越小,精準度越高,但是專案的壓力越大,我們上一個專案就有這種狀況,太多定時器在跑,專案執行起來比較笨重。
(2)而且需要處理的是過期的訂單,但是要查詢所有未支付的訂單,範圍大。對於大訂單量的操作不合適。
@Schedule(cron="0/5 * * * * ?")
按順序依次為
1 秒(0~59)
2 分鐘(0~59)
3 小時(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)eg1: 0 0 10,14,16 * * ? 每天上午10點,下午2點,4點
eg2: 0 15 10 * * ? 2005 2005年的每天上午10:15觸發
過期提醒:
基於redis的過期提醒功能;
1、修改redis配置開啟“過期提醒”
notify-keyspace-events
改為notify-keyspace-events "Ex"
2、繼承
KeyExpirationEventMessageListener ,重寫onMessageimport org.springframework.data.redis.connection.Message; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; import java.util.Date; /** * @author mashu * Date 2020/5/17 23:01 */ @Component public class OrderExpirationListener extends KeyExpirationEventMessageListener { public OrderExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { final String expiredKey = message.toString(); System.out.println("我過期了" + expiredKey+"當前時間:"+new Date()); } }
3、向redis中存入一個訂單,過期時間為1分鐘。
redis.set("orderCode/10010", "1", 1L, TimeUnit.MINUTES); System.out.println("redis存入訂單號 key: orderCode/10010,value:1,過期時間一分鐘,當前時間"+new Date());
4、執行
相關文章
- 訂單超時自動關閉的實現方案總結
- 高效實現銷售出庫單與訂單自動對接的方案介紹
- Redis sortedset實現元素自動過期Redis
- 訂單30分鐘未支付自動取消怎麼實現?
- Laravel實現:待付款訂單,超48小時自動關閉Laravel
- 微信訂閱號實現AI自動回覆AI
- OkHttp+Retrofit+RxJava 實現過期Token自動重新整理HTTPRxJava
- 用 VB 實現表單的自動提交 (轉)
- 訂單自動生成器的演算法研究與實現薦演算法
- 領導:誰再用redis過期監聽實現關閉訂單,立馬滾蛋!Redis
- Java自動生成訂單序列號Java
- 訂單超時關閉訂單的實現操作
- 自繪選單的實現 (轉)
- guava cache過期方案實踐Guava
- 如何實現頁面廣告隨時上下線、過期自動下線及到時自動上線
- 聯動選單的實現方案探索
- 微信支付訂單、退款訂單、轉款訂單的查詢
- iOS內購非自動續期訂閱 應用內購買 IAP非自動續期訂閱 消耗型商品 非消耗型商品 流程...iOS
- Redis鍵不會自動過期 - AblyRedis
- [實戰]laravel + redis訂閱釋出 +swoole實現實時訂單通知LaravelRedis
- 華為工單寶:助力製造業實現數字化轉型,透過專案管理實現售後服務自動化專案管理
- 教你實現windowsxp自動登入大法(轉)Windows
- TableStore實戰:億量級訂單管理解決方案
- 【手摸手玩轉 OceanBase 168】如何自動清理過期備份?
- 簡單實現安卓app自動更新功能安卓APP
- 透過ini實現多語言選單 (轉)
- 聊聊「訂單」業務的設計與實現
- js 實現簡單釋出訂閱模式JS模式
- rsync的自動指令碼實現方案(非rsyncd服務)指令碼
- 配置ks.cfg實現自動安裝過程
- 通過 Spring AOP 註解實現自動代理Spring
- 通過keepalived實現 MySQL VIP 自動切換MySql
- Android UI 自動化測試實現過程AndroidUI
- 4.2.13 主備庫實現自動故障轉移
- VB中實現窗體自動隱藏 (轉)
- 在window 上實現每日定時備份一期訂單並ftp的指令碼FTP指令碼
- 登入過期--localStorage加sessionStorage實現7天登入過期Session
- 訂單交易平臺三(登入介面整個實現過程)階段一(只實現簡單的登入功能)