成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

SpringBoot集成Redisson實現延遲隊列的場景分析

瀏覽:200日期:2023-03-16 14:02:04
使用場景

1、下單成功,30分鐘未支付。支付超時,自動取消訂單

2、訂單簽收,簽收后7天未進行評價。訂單超時未評價,系統默認好評

3、下單成功,商家5分鐘未接單,訂單取消

4、配送超時,推送短信提醒

......

對于延時比較長的場景、實時性不高的場景,我們可以采用任務調度的方式定時輪詢處理。如:xxl-job

今天我們采用一種比較簡單、輕量級的方式,使用 Redis 的延遲隊列來進行處理。當然有更好的解決方案,可根據公司的技術選型和業務體系選擇最優方案。如:使用消息中間件Kafka、RabbitMQ 的延遲隊列

先不討論其實現原理,直接實戰上代碼先實現基于 Redis 的延遲隊列

1、引入 Redisson 依賴

<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.10.5</version></dependency>

2、Nacos 配置 Redis 連接

spring: redis: host: 127.0.0.1 port: 6379 password: 123456 database: 12 timeout: 3000

3、創建 RedissonConfig 配置

/** * Created by LPB on 2020/04/20. */@Configurationpublic class RedissonConfig { @Value('${spring.redis.host}')private String host;@Value('${spring.redis.port}')private int port;@Value('${spring.redis.database}')private int database;@Value('${spring.redis.password}')private String password; @Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress('redis://' + host + ':' + port).setDatabase(database).setPassword(password);return Redisson.create(config);} }

4、封裝 Redis 延遲隊列工具類

/** * redis延遲隊列工具 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueUtil { @Autowiredprivate RedissonClient redissonClient; /** * 添加延遲隊列 * @param value 隊列值 * @param delay 延遲時間 * @param timeUnit 時間單位 * @param queueCode 隊列鍵 * @param <T> */ public <T> void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){try { RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueCode); RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingDeque); delayedQueue.offer(value, delay, timeUnit);log.info('(添加延時隊列成功) 隊列鍵:{},隊列值:{},延遲時間:{}', queueCode, value, timeUnit.toSeconds(delay) + '秒');} catch (Exception e) { log.error('(添加延時隊列失敗) {}', e.getMessage()); throw new RuntimeException('(添加延時隊列失敗)');} } /** * 獲取延遲隊列 * @param queueCode * @param <T> * @return * @throws InterruptedException */ public <T> T getDelayQueue(String queueCode) throws InterruptedException {RBlockingDeque<Map> blockingDeque = redissonClient.getBlockingDeque(queueCode);T value = (T) blockingDeque.take();return value;}}

5、創建延遲隊列業務枚舉

/** * 延遲隊列業務枚舉 * Created by LPB on 2021/04/20. */@Getter@NoArgsConstructor@AllArgsConstructorpublic enum RedisDelayQueueEnum { ORDER_PAYMENT_TIMEOUT('ORDER_PAYMENT_TIMEOUT','訂單支付超時,自動取消訂單', 'orderPaymentTimeout'),ORDER_TIMEOUT_NOT_EVALUATED('ORDER_TIMEOUT_NOT_EVALUATED', '訂單超時未評價,系統默認好評', 'orderTimeoutNotEvaluated'); /** * 延遲隊列 Redis Key */private String code; /** * 中文描述 */private String name; /** * 延遲隊列具體業務實現的 Bean * 可通過 Spring 的上下文獲取 */private String beanId; }

6、定義延遲隊列執行器

/** * 延遲隊列執行器 * Created by LPB on 2021/04/20. */public interface RedisDelayQueueHandle<T> { void execute(T t); }

7、創建枚舉中定義的Bean,并實現延遲隊列執行器 OrderPaymentTimeout:訂單支付超時延遲隊列處理類

/** * 訂單支付超時處理類 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderPaymentTimeout implements RedisDelayQueueHandle<Map> {@Overridepublic void execute(Map map) {log.info('(收到訂單支付超時延遲消息) {}', map);// TODO 訂單支付超時,自動取消訂單處理業務... }}

OrderTimeoutNotEvaluated:訂單超時未評價延遲隊列處理類

/** * 訂單超時未評價處理類 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderTimeoutNotEvaluated implements RedisDelayQueueHandle<Map> {@Overridepublic void execute(Map map) {log.info('(收到訂單超時未評價延遲消息) {}', map);// TODO 訂單超時未評價,系統默認好評處理業務... }}

8、創建延遲隊列消費線程,項目啟動完成后開啟

/** * 啟動延遲隊列 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueRunner implements CommandLineRunner { @Autowiredprivate RedisDelayQueueUtil redisDelayQueueUtil; @Overridepublic void run(String... args) {new Thread(() -> {while (true){try {RedisDelayQueueEnum[] queueEnums = RedisDelayQueueEnum.values();for (RedisDelayQueueEnum queueEnum : queueEnums) {Object value = redisDelayQueueUtil.getDelayQueue(queueEnum.getCode());if (value != null) {RedisDelayQueueHandle redisDelayQueueHandle = SpringUtil.getBean(queueEnum.getBeanId());redisDelayQueueHandle.execute(value);}}} catch (InterruptedException e) {log.error('(Redis延遲隊列異常中斷) {}', e.getMessage());}}}).start();log.info('(Redis延遲隊列啟動成功)');}}

以上步驟,Redis 延遲隊列核心代碼已經完成,下面我們寫一個測試接口,用 PostMan 模擬測試一下

9、創建一個測試接口,模擬添加延遲隊列

/** * 延遲隊列測試 * Created by LPB on 2020/04/20. */@RestControllerpublic class RedisDelayQueueController { @Autowiredprivate RedisDelayQueueUtil redisDelayQueueUtil; @PostMapping('/addQueue')public void addQueue() {Map<String, String> map1 = new HashMap<>();map1.put('orderId', '100');map1.put('remark', '訂單支付超時,自動取消訂單'); Map<String, String> map2 = new HashMap<>();map2.put('orderId', '200');map2.put('remark', '訂單超時未評價,系統默認好評'); // 添加訂單支付超時,自動取消訂單延遲隊列。為了測試效果,延遲10秒鐘redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode()); // 訂單超時未評價,系統默認好評。為了測試效果,延遲20秒鐘redisDelayQueueUtil.addDelayQueue(map2, 20, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode());} }

10、啟動 SpringBoot 項目,用 PostMan 調用接口添加延遲隊列 通過 Redis 客戶端可看到兩個延遲隊列已添加成功

SpringBoot集成Redisson實現延遲隊列的場景分析

查看 IDEA 控制臺日志可看到延遲隊列已消費成功

SpringBoot集成Redisson實現延遲隊列的場景分析

到此這篇關于SpringBoot集成Redisson實現延遲隊列的文章就介紹到這了,更多相關SpringBoot Redisson延遲隊列內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99re热精品| 国产一区二区伦理| 久久国产精品第一页| 午夜亚洲视频| 亚洲精品乱码久久久久久久久| 欧美国产一区二区三区激情无套| 精品三级在线观看| 国产成人免费在线视频| 欧美日韩视频在线一区二区| 首页欧美精品中文字幕| 亚洲免费影院| 亚洲国产精品一区二区www在线| 亚洲九九精品| 国产精品人妖ts系列视频| 色综合天天综合网国产成人综合天 | 欧美日本三区| 久久精品人人做人人综合 | 国产女人18毛片水真多成人如厕| 成人小视频在线| 欧美成人r级一区二区三区| 国产jizzjizz一区二区| 日韩无一区二区| 成年人国产精品| 精品精品国产高清a毛片牛牛| 粉嫩绯色av一区二区在线观看 | 麻豆精品久久久| 91福利在线导航| 麻豆精品视频在线观看| 欧美日韩aaaaaa| 国产成人av一区二区三区在线观看| 欧美精品国产精品| 国产成人精品一区二区三区四区| 欧美r级电影在线观看| 白白色 亚洲乱淫| 国产区在线观看成人精品| 欧美xx69| 亚洲欧美一区二区不卡| 免费在线播放第一区高清av| 婷婷丁香激情综合| 欧美在线综合视频| 国产福利一区在线观看| 精品国产亚洲在线| 欧美色图麻豆| 夜夜嗨av一区二区三区中文字幕| 久久资源在线| 国产一区二区导航在线播放| 精品国产污污免费网站入口| 欧美日韩久久| 一区二区三区在线观看动漫| 西西人体一区二区| 免费成人av在线| 日韩一区二区精品在线观看| 99精品视频一区| 日韩一区在线免费观看| 美女图片一区二区| 国产在线一区观看| 国产三级精品三级在线专区| 99精品99久久久久久宅男| 美女视频黄 久久| 欧美成人猛片aaaaaaa| 合欧美一区二区三区| 亚洲成在线观看| 3atv一区二区三区| 国产精品高清一区二区三区| 亚洲综合色网站| 在线视频国内自拍亚洲视频| 国产69精品久久久久777| 国产精品免费av| 色国产综合视频| youjizz久久| 亚洲免费毛片网站| 欧美日韩中文精品| 96av麻豆蜜桃一区二区| 亚洲欧美视频一区| 欧美视频自拍偷拍| 欧美呦呦网站| 日日摸夜夜添夜夜添亚洲女人| 日韩三级.com| 亚洲精品孕妇| 韩国女主播成人在线观看| 26uuu国产日韩综合| 一本色道久久综合亚洲精品不卡 | 久久精品亚洲乱码伦伦中文 | 欧美精选在线| 日韩av电影免费观看高清完整版在线观看| 在线影院国内精品| 久久综合电影| 成人自拍视频在线| 欧美大肚乱孕交hd孕妇| 另类图片国产| 久久九九免费| 激情综合色丁香一区二区| 精品国产成人系列| 一本久道久久综合婷婷鲸鱼| 国产美女精品人人做人人爽| 国产精品久久久久久久久免费樱桃| 久久久国产精品一区二区三区| 国产高清精品在线| 亚洲国产一区视频| 精品国产电影一区二区| 性欧美精品高清| 91丨九色丨尤物| 日本不卡的三区四区五区| 久久久久久久av麻豆果冻| 国产精品推荐精品| 色婷婷国产精品| 国内精品久久国产| 国产福利一区二区| 午夜精品久久久久久久99水蜜桃| 久久久三级国产网站| 91激情五月电影| 欧美日本中文| 国产在线精品一区二区不卡了| 亚洲少妇最新在线视频| 日韩午夜在线观看| 亚洲一区影院| 91偷拍与自偷拍精品| 麻豆精品新av中文字幕| 1000部国产精品成人观看| 欧美一区日本一区韩国一区| 日韩午夜激情| 制服丝袜亚洲色图| 久久青青草综合| 亚洲二区精品| 99re热这里只有精品免费视频| 久久99国产精品成人| 亚洲午夜电影在线| 国产精品家庭影院| 2024国产精品| 欧美一a一片一级一片| 国产亚洲综合精品| 欧美日韩亚洲一区二区三区在线观看 | 成人视屏免费看| 青娱乐精品视频在线| 一区二区三区影院| 国产精品久久久久久久久快鸭| 99久久精品免费观看| 国产一区二区三区高清播放| 亚洲aaa精品| 亚洲日本一区二区| 国产欧美一区视频| 欧美一区中文字幕| 欧美日韩在线播| 久久人人97超碰人人澡爱香蕉| 亚洲国产专区校园欧美| 色综合久久综合网欧美综合网| 久久91精品久久久久久秒播| 亚洲综合另类小说| 自拍偷拍国产精品| 日本一二三四高清不卡| 精品久久免费看| 欧美精品高清视频| 欧美影院一区二区三区| 久久亚洲不卡| 国产精品免费一区二区三区在线观看| 欧美三区美女| 欧美日韩国产精品一区二区亚洲| 成人性生交大片免费看视频在线| 国产麻豆欧美日韩一区| 老司机免费视频一区二区| 日韩福利视频导航| 亚洲一区二区三区免费视频| 日韩美女精品在线| ...xxx性欧美| 综合激情成人伊人| 日韩伦理av电影| 国产精品国产三级国产普通话蜜臀 | 国产美女精品人人做人人爽 | 国产精品亚洲一区二区三区在线| 久久精品国产一区二区| 日本欧洲一区二区| 午夜影院久久久| 亚洲mv大片欧洲mv大片精品| 午夜激情久久久| 亚洲国产日韩精品| 亚洲一区二区视频| 亚洲成在人线免费| 亚洲成人在线网站| 亚洲国产成人91porn| 亚洲国产精品人人做人人爽| 伊人夜夜躁av伊人久久| 亚洲综合免费观看高清在线观看| 亚洲自拍都市欧美小说| 亚洲成人先锋电影| 日韩av在线免费观看不卡| 秋霞午夜av一区二区三区| 蜜桃视频一区二区| 久久黄色级2电影| 国产精品一区二区x88av| 国产91丝袜在线18| 波多野洁衣一区| 欧美成人69av| 国产精品对白刺激久久久| 亚洲区一区二| 免费亚洲婷婷| 欧美这里有精品| 在线播放日韩导航| 2021中文字幕一区亚洲| 国产欧美日产一区| 尤物在线观看一区|