最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、概述:

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

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

另一種解決方法是使用消息隊(duì)列來(lái)保證任務(wù)的冪等性。當(dāng)一個(gè)節(jié)點(diǎn)執(zhí)行任務(wù)時(shí),先將任務(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)。

二、示例

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

在這里插入圖片描述

解決方法–Redission分布式鎖:

  • 在啟動(dòng)定時(shí)任務(wù)時(shí),獲取分布式鎖,保證只有一個(gè)線程進(jìn)入
  • 在獲取鎖之后,鎖定10秒
  • 然后執(zhí)行業(yè)務(wù)
  • 業(yè)務(wù)執(zhí)行完成后,釋放分布式鎖
@Scheduled(cron = "*/10 * * * * ? ")    
public void uploadSeckillSkuLatest3Days() {
    // 重復(fù)上架無(wú)需處理
    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();
    }
}

上架商品時(shí),判斷redis是否有該商品,沒(méi)有才上架

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

全部代碼

private void saveSessionInfos(List<SeckillSessionWithSkusTO> sessions) {
        if (!CollectionUtils.isEmpty(sessions)) {
            sessions.stream().forEach(session -> {
                // 1.遍歷場(chǎng)次
                long startTime = session.getStartTime().getTime();// 場(chǎng)次開始時(shí)間戳
                long endTime = session.getEndTime().getTime();// 場(chǎng)次結(jié)束時(shí)間戳
                String key = SeckillConstant.SESSION_CACHE_PREFIX + startTime + "_" + endTime;// 場(chǎng)次的key
                // 2.判斷場(chǎng)次是否已上架(冪等性)
                Boolean hasKey = redisTemplate.hasKey(key);
                if (!hasKey) {
                    // 未上架
                    // 3.封裝場(chǎng)次信息
                    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 定時(shí)任務(wù)分布式下冪等性如何解決的文章就介紹到這了,更多相關(guān)Springboot 冪等性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java8新特性Stream流詳解

    Java8新特性Stream流詳解

    Java8 Stream使用的是函數(shù)式編程模式,如同它的名字一樣,它可以被用來(lái)對(duì)集合進(jìn)行鏈狀流式的操作,本文就將帶著你如何使用 Java 8 不同類型的 Stream 操作,同時(shí)還將了解流的處理順序,以及不同順序的流操作是如何影響運(yùn)行時(shí)性能的
    2023-07-07
  • java調(diào)用微信現(xiàn)金紅包接口的心得與體會(huì)總結(jié)

    java調(diào)用微信現(xiàn)金紅包接口的心得與體會(huì)總結(jié)

    這篇文章主要介紹了java調(diào)用微信現(xiàn)金紅包接口的心得與體會(huì)總結(jié),有需要的朋友可以了解一下。
    2016-11-11
  • java常用工具類 Date日期、Mail郵件工具類

    java常用工具類 Date日期、Mail郵件工具類

    這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括Date日期、Mail郵件工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法

    jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法

    這篇文章主要介紹了jenkins+Maven從SVN上構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring Mybatis 基本使用過(guò)程(推薦)

    Spring Mybatis 基本使用過(guò)程(推薦)

    Mybatis是一個(gè)半自動(dòng)ORM(Object Relational Mapping)框架,它可以簡(jiǎn)化數(shù)據(jù)庫(kù)編程,讓開發(fā)者更專注于SQL本身,本文給大家介紹Spring Mybatis 基本使用過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • MyBatis超詳細(xì)講解如何實(shí)現(xiàn)分頁(yè)功能

    MyBatis超詳細(xì)講解如何實(shí)現(xiàn)分頁(yè)功能

    MyBatis-Plus?是一個(gè)?Mybatis?增強(qiáng)版工具,在?MyBatis?上擴(kuò)充了其他功能沒(méi)有改變其基本功能,為了簡(jiǎn)化開發(fā)提交效率而存在,本篇文章帶用它實(shí)現(xiàn)分頁(yè)功能
    2022-03-03
  • SpringBoot使用CORS解決無(wú)法跨域訪問(wèn)問(wèn)題的具體步驟

    SpringBoot使用CORS解決無(wú)法跨域訪問(wèn)問(wèn)題的具體步驟

    跨域問(wèn)題指的是不同站點(diǎn)之間,使用 ajax 無(wú)法相互調(diào)用的問(wèn)題,跨域問(wèn)題本質(zhì)是瀏覽器的一種保護(hù)機(jī)制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),本文給大家介紹了SpringBoot使用CORS解決無(wú)法跨域訪問(wèn)問(wèn)題的具體步驟,需要的朋友可以參考下
    2025-05-05
  • SpringBoot3整合Druid數(shù)據(jù)源的實(shí)現(xiàn)過(guò)程

    SpringBoot3整合Druid數(shù)據(jù)源的實(shí)現(xiàn)過(guò)程

    文章介紹了一個(gè)基于Spring?Boot?3的程序?qū)崿F(xiàn)過(guò)程,包括創(chuàng)建項(xiàng)目、引入依賴、編寫啟動(dòng)類、配置文件、Controller、啟動(dòng)測(cè)試以及問(wèn)題解決,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java 日期時(shí)間處理詳解(API、格式化)

    Java 日期時(shí)間處理詳解(API、格式化)

    在編程中,對(duì)日期和時(shí)間的處理是一個(gè)非常重要的方面,Java提供了豐富的類和工具來(lái)處理日期和時(shí)間,本文將對(duì)Java中的日期時(shí)間處理進(jìn)行詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java九九乘法表示例

    java九九乘法表示例

    這篇文章主要介紹了java九九乘法表示例,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

年辖:市辖区| 贵阳市| 广东省| 江津市| 任丘市| 沙湾县| 林芝县| 平阳县| 肥乡县| 札达县| 依兰县| 剑川县| 临夏县| 五常市| 喀什市| 昌图县| 望城县| 湄潭县| 博湖县| 阳江市| 昌江| 乃东县| 郎溪县| 大理市| 浦城县| 祁东县| 定陶县| 临沧市| 屯昌县| 开平市| 耒阳市| 大洼县| 海丰县| 汾阳市| 建德市| 左贡县| 那坡县| 龙川县| 革吉县| 阳城县| 调兵山市|