亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Springboot?定時任務(wù)分布式下冪等性解決方案

 更新時間:2023年07月05日 09:51:36   作者:lovoo  
這篇文章主要介紹了Springboot定時任務(wù)分布式下冪等性如何解決,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、概述:

在分布式環(huán)境下,定時任務(wù)的冪等性問題需要考慮多個節(jié)點(diǎn)之間的數(shù)據(jù)一致性和事務(wù)處理。

一種解決方法是使用分布式鎖來保證同一時間只有一個節(jié)點(diǎn)能夠執(zhí)行該任務(wù)。具體實(shí)現(xiàn)可以使用Redis或Zookeeper等分布式協(xié)調(diào)工具提供的分布式鎖功能。

另一種解決方法是使用消息隊(duì)列來保證任務(wù)的冪等性。當(dāng)一個節(jié)點(diǎn)執(zhí)行任務(wù)時,先將任務(wù)發(fā)送到消息隊(duì)列中,然后等待其他節(jié)點(diǎn)確認(rèn)任務(wù)已經(jīng)執(zhí)行完畢后再進(jìn)行后續(xù)操作。如果有節(jié)點(diǎn)出現(xiàn)故障或者網(wǎng)絡(luò)異常導(dǎo)致任務(wù)未能成功執(zhí)行,則可以重新發(fā)送任務(wù)并等待其他節(jié)點(diǎn)確認(rèn)。

二、示例

如下圖,有三臺機(jī)器同時啟動定時任務(wù),將數(shù)據(jù)保存到Redis中,如何保證數(shù)據(jù)的冪等性?

在這里插入圖片描述

解決方法–Redission分布式鎖:

  • 在啟動定時任務(wù)時,獲取分布式鎖,保證只有一個線程進(jìn)入
  • 在獲取鎖之后,鎖定10秒
  • 然后執(zhí)行業(yè)務(wù)
  • 業(yè)務(wù)執(zhí)行完成后,釋放分布式鎖
@Scheduled(cron = "*/10 * * * * ? ")    
public void uploadSeckillSkuLatest3Days() {
    // 重復(fù)上架無需處理
    log.info("上架秒殺的商品...");
    // 分布式鎖(冪等性)
    RLock lock = redissonClient.getLock(SeckillConstant.UPLOAD_LOCK);
    try {
        lock.lock(10, TimeUnit.SECONDS);
        // 上架最近三天需要秒殺的商品
        seckillService.uploadSeckillSkuLatest3Days();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

上架商品時,判斷redis是否有該商品,沒有才上架

 Boolean hasKey = redisTemplate.hasKey(key);
 if (!hasKey) {
 }

全部代碼

private void saveSessionInfos(List<SeckillSessionWithSkusTO> sessions) {
        if (!CollectionUtils.isEmpty(sessions)) {
            sessions.stream().forEach(session -> {
                // 1.遍歷場次
                long startTime = session.getStartTime().getTime();// 場次開始時間戳
                long endTime = session.getEndTime().getTime();// 場次結(jié)束時間戳
                String key = SeckillConstant.SESSION_CACHE_PREFIX + startTime + "_" + endTime;// 場次的key
                // 2.判斷場次是否已上架(冪等性)
                Boolean hasKey = redisTemplate.hasKey(key);
                if (!hasKey) {
                    // 未上架
                    // 3.封裝場次信息
                    List<String> skuIds = session.getRelationSkus().stream()
                            .map(item -> item.getPromotionSessionId() + "_" + item.getSkuId().toString())
                            .collect(Collectors.toList());// skuId集合
                    // 4.上架
                    redisTemplate.opsForList().leftPushAll(key, skuIds);
                }
            });
        }
    }

到此這篇關(guān)于Springboot 定時任務(wù)分布式下冪等性如何解決的文章就介紹到這了,更多相關(guān)Springboot 冪等性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot中yml文件不生效原因分析及解決

    Springboot中yml文件不生效原因分析及解決

    這篇文章給大家介紹了Springboot中yml文件不生效原因分析及解決方法,通過圖文給大家講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 詳解Maven多模塊打包遇到的問題解決方法

    詳解Maven多模塊打包遇到的問題解決方法

    這篇文章主要介紹了詳解Maven多模塊打包遇到的問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Java執(zhí)行g(shù)roovy腳本的兩種方式

    詳解Java執(zhí)行g(shù)roovy腳本的兩種方式

    這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤

    淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤

    本篇文章主要介紹了淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • IDEA中打jar包的2種方式(Maven打jar包)

    IDEA中打jar包的2種方式(Maven打jar包)

    這篇文章主要給大家介紹了關(guān)于IDEA中打jar包的2種方式,分別是不使用Maven直接打Jar包與使用Maven打jar包的兩種方法,需要的朋友可以參考下
    2021-05-05
  • Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)

    Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。
    2017-04-04
  • java servlet手機(jī)app訪問接口(二)短信驗(yàn)證

    java servlet手機(jī)app訪問接口(二)短信驗(yàn)證

    這篇文章主要介紹了java servlet手機(jī)app訪問接口(二),短信驗(yàn)證,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解

    Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解

    這篇文章主要介紹了 Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 全局請求添加TraceId輕松看日志

    全局請求添加TraceId輕松看日志

    這篇文章主要為大家介紹了全局請求添加TraceId,更加方便輕松的看日志,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 詳解Log4j 日志文件存放位置設(shè)置

    詳解Log4j 日志文件存放位置設(shè)置

    這篇文章主要介紹了詳解Log4j 日志文件存放位置設(shè)置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論