訂單自動過期實現方案 - 轉
轉 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、執行
相關文章
- 訂單超時自動關閉的實現方案總結
- 高效實現銷售出庫單與訂單自動對接的方案介紹
- 訂單自動確認或取消設計方案
- 訂單30分鐘未支付自動取消怎麼實現?
- Laravel實現:待付款訂單,超48小時自動關閉Laravel
- OkHttp+Retrofit+RxJava 實現過期Token自動重新整理HTTPRxJava
- 領導:誰再用redis過期監聽實現關閉訂單,立馬滾蛋!Redis
- 微信訂閱號實現AI自動回覆AI
- Java自動生成訂單序列號Java
- guava cache過期方案實踐Guava
- 【手摸手玩轉 OceanBase 168】如何自動清理過期備份?
- 資料自動同步方案實施指南:企業如何實現高效資料流轉?
- 如何實現頁面廣告隨時上下線、過期自動下線及到時自動上線
- [實戰]laravel + redis訂閱釋出 +swoole實現實時訂單通知LaravelRedis
- Redis鍵不會自動過期 - AblyRedis
- iOS內購非自動續期訂閱 應用內購買 IAP非自動續期訂閱 消耗型商品 非消耗型商品 流程...iOS
- 華為工單寶:助力製造業實現數字化轉型,透過專案管理實現售後服務自動化專案管理
- 4.2.13 主備庫實現自動故障轉移
- TableStore實戰:億量級訂單管理解決方案
- 用低程式碼平臺,5分鐘實現報價轉訂單功能
- 分享一個session過期後根據guard跳轉的實現Session
- js 實現簡單釋出訂閱模式JS模式
- SpringBoot+MongoDB實現物流訂單系統Spring BootMongoDB
- 配置ks.cfg實現自動安裝過程
- 訂單交易平臺三(登入介面整個實現過程)階段一(只實現簡單的登入功能)
- 登入過期--localStorage加sessionStorage實現7天登入過期Session
- python3+telnetlib實現簡單自動測試Python
- SAP S/4HANA銷售訂單建立時,會自動觸發生產訂單的建立
- Oracle 11.2.0.4 awr過期快照無法自動清理Oracle
- 通過自動化和現代化實現網路優化優化
- C/C++ 單元自動化測試解決方案實踐C++
- linux透過shell指令碼實現ssh互動式自動化Linux指令碼
- 直播原始碼網站,實現文字自動翻轉效果原始碼網站
- 建立訂單實現冪等的一點思考
- 「crudapi」零程式碼實現訂單序列號SequenceAPI
- 聊聊「訂單」業務的設計與實現
- php+redis實現超時取消訂單功能PHPRedis
- SpringBoot Windows 自啟動 - 透過 Windows Service 服務實現Spring BootWindows