国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式秒殺方案--java

這篇具有很好參考價值的文章主要介紹了分布式秒殺方案--java。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前提:先把商品詳情和秒殺商品緩存redis中,減少對數(shù)據(jù)庫的訪問(可使用定時任務(wù))
秒殺商品無非就是那幾步(前面還可能會有一些判斷,如用戶是否登錄,一人一單,秒殺時間驗證等)
1一人一單
2.判斷庫存
3.減庫存
4.創(chuàng)建訂單

秒殺需要解決的問題?

1.解決超賣問題

1.1這樣秒殺肯定會出現(xiàn)超賣的情況,所以必須加鎖。加鎖無非就兩種鎖,樂觀鎖和悲觀鎖。
悲觀鎖:直接在1前上鎖即可,這里使用redisson里的可重入鎖

        // 獲取分布式鎖對象
        RLock lock = redissonClient.getLock("seckillLock");
        try {
            //等待5秒獲取鎖,執(zhí)行60秒還是沒有釋放鎖就強制釋放
            boolean b = lock.tryLock(5L, 60L, TimeUnit.SECONDS);
            if (b){
               SeckillProductVo  seckillProductVo = seckillProductService.find(time, seckillId);
                //1.保證庫存足夠
                if (seckillProductVo.getStockCount()<=0){
                    return Result.error(SeckillCodeMsg.SECKILL_STOCK_OVER);
                }
              //下面兩個方法必須寫在一起避免事務(wù)未提交,未扣減庫存就釋放鎖
            //2.扣減庫存
            //3.生成訂單
                orderInfo=orderInfoService.doSeckill(phone,seckillProductVo);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

1.2樂觀鎖:這個就不需要用代碼演示了
1一人一單
2.判斷庫存
3.減庫存
4.創(chuàng)建訂單

在3.減庫存的時候mysql語句 and 庫存>0即可,MySQL會有自己的行鎖。所以每次只會執(zhí)行一次修改操作。以上兩個方法都不會造成超賣
但是卻未能解決秒殺問題,原因高并發(fā)請求都進入了數(shù)據(jù)庫來查庫,會造成數(shù)據(jù)庫崩潰或阻塞其它mysql的執(zhí)行。

2.重復(fù)下單問題,如何解決?

2.1 在4.創(chuàng)建訂單后,把用戶的唯一標(biāo)識,id或phone存入redis的set中 key->{phone1,phone2}
redisTemplate.opsForSet().isMember(orderKey,phone)返回true或false
流程變成 1.一人一單 2.判斷庫存 3.減庫存 4.創(chuàng)建訂單 5.redisTemplate.opsForSet().add(orderKey,phone);

2.2 但是這樣并不能完全解決重復(fù)下單,比如用戶同時點了兩次請求。極端條件下,a線程進入步驟1的判斷,從1到4 需要進行很多操作,當(dāng)a線程未走到5時,b線程就進來了這樣也會造成重復(fù)下單。所以必須使用數(shù)據(jù)庫的唯一索引進行解決,把用戶唯一標(biāo)識和秒殺商品唯一標(biāo)識做成唯一索引即可解決
分布式秒殺方案--java,分布式,java,開發(fā)語言
也就是在 4.創(chuàng)建訂單 的時候會出現(xiàn)報錯,3庫存減掉之后數(shù)據(jù)回滾即可。
然而redis里的庫存卻和數(shù)據(jù)庫的就不一樣了,redis是無法被回滾的。后面會使用cannal對數(shù)據(jù)庫和redis的庫存進行同步。。。
有些人可能會說了,2.1沒有解決重復(fù)問題,為什么不直接用2.2解決?2.1在大部分情況下都能解決,避免有人多次點擊秒殺對數(shù)據(jù)造成壓力,所以2.1和2.2一起使用才是最佳的選擇

3.流量控制
3.1 必須把請求攔截在數(shù)據(jù)庫之外,如果庫存只有10個,也只有10個線程能最終到達數(shù)據(jù)庫就是一個比較理想的方案
所以把數(shù)據(jù)庫的秒殺商品庫存存入redis中,進行預(yù)售,只有redis里能執(zhí)行
Long res=redisTemplate.increment(key,-1)減1且返回值res不為負(fù)數(shù)
才能進入service,這樣就極大的減少了請求到service層中

3.2 如果同一個秒殺時間段有多個商品 如100個秒殺商品,每個秒殺商品的庫存為10個,那么就會有10*100個請求到達數(shù)據(jù)庫,如果是淘寶的雙11顯然秒殺的商品會更多。那么我們就需要進行流量的削峰控制。
分布式秒殺方案--java,分布式,java,開發(fā)語言
從controller中攔截消息,service取消息的時候慢慢拿,mq能夠占時的讓一部分請求存儲在里面排隊處理,service根據(jù)自己的處理能力去拿。有些人可能會說排隊處理不是很慢?在controller中發(fā)完消息這個請求已經(jīng)可以算是結(jié)束了,用戶不會立即看到搶購結(jié)果。后面經(jīng)過
分布式秒殺方案--java,分布式,java,開發(fā)語言

分布式秒殺方案--java,分布式,java,開發(fā)語言
最終方案
分布式秒殺方案--java,分布式,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-701220.html

到了這里,關(guān)于分布式秒殺方案--java的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Golang實現(xiàn)Redis分布式鎖解決秒殺問題

    先寫一個腳本sql,插入2000個用戶 登錄是通過2個字段,一個是mobile,一個是password,生成了mobile從1到2000,密碼默認(rèn)是123456 然后寫一個單元測試,實現(xiàn)新注冊的2000個用戶登錄,然后獲取token 我們使用有緩沖的通道和sync.WaitGroup信號量,來控制協(xié)程的數(shù)量,經(jīng)過測試,發(fā)現(xiàn)limi

    2024年02月14日
    瀏覽(23)
  • Redis分布式鎖原理之實現(xiàn)秒殺搶優(yōu)惠卷業(yè)務(wù)

    Redis分布式鎖原理之實現(xiàn)秒殺搶優(yōu)惠卷業(yè)務(wù)

    背景 優(yōu)惠券秒殺有兩個業(yè)務(wù)涉及線程并發(fā)問題,第一個是庫存超賣,第二個是一人一單,這就必須采取鎖的方案了。下面根據(jù)優(yōu)惠券秒殺功能一步一步進行展開,利用悲觀鎖、同步鎖、分布式鎖等方案循序漸進解決各種問題。 下單核心思路:當(dāng)我們點擊搶購時,會觸發(fā)右側(cè)

    2024年02月03日
    瀏覽(19)
  • 【Java】三種方案實現(xiàn) Redis 分布式鎖

    【Java】三種方案實現(xiàn) Redis 分布式鎖

    setnx、Redisson、RedLock 都可以實現(xiàn)分布式鎖,從易到難得排序為:setnx Redisson RedLock。一般情況下,直接使用 Redisson 就可以啦,有很多邏輯框架的作者都已經(jīng)考慮到了。 1.1、簡單實現(xiàn) 下面的鎖實現(xiàn)可以用在測試或者簡單場景,但是它存在以下問題,使其不適合用在正式環(huán)境。

    2024年02月05日
    瀏覽(25)
  • 【Redis】4、全局唯一 ID生成、單機(非分布式)情況下的秒殺和一人一單

    【Redis】4、全局唯一 ID生成、單機(非分布式)情況下的秒殺和一人一單

    ?? id 字段不是 自增 AUTO_INCREMENT 的 每個店鋪都可以發(fā)布優(yōu)惠券: 用戶搶購的時候會生成訂單并保存到 tb_voucher_order 這張表中 如訂單 id 使用數(shù)據(jù)庫自增 ID 會出現(xiàn)以下問題: ?? id 規(guī)律性太明顯(可能會被用戶猜測到優(yōu)惠券的 id) ?? 受單表數(shù)據(jù)量的限制(優(yōu)惠券訂單可能很多

    2024年02月16日
    瀏覽(25)
  • JAVA開發(fā)(分布式部署微服務(wù)注冊到Eureka出現(xiàn)registration status: 204錯誤)

    JAVA開發(fā)(分布式部署微服務(wù)注冊到Eureka出現(xiàn)registration status: 204錯誤)

    將服務(wù)注冊到多個Eureka出現(xiàn)有點的服務(wù)只注冊到一個Eureka有點的服務(wù)可以注冊到多個Eureka的問題,有的注冊不上,報錯:registration status: 204 Eureka1: Eureka2: ?從截圖可以看出有兩臺服務(wù)器上的 HN-BASE-ADMIN 和HN-BLOCKCHAIN-BUSINESS都可以注冊到Eureka1 HN-BASE-GATEWAY分別都只有一臺服務(wù)器

    2024年02月08日
    瀏覽(24)
  • 【分布式事務(wù)】Seata 開源的分布式事務(wù)解決方案

    【分布式事務(wù)】Seata 開源的分布式事務(wù)解決方案

    Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。 阿里巴巴作為國內(nèi)最早一批進行應(yīng)用分布式(微服務(wù)化)改造的企業(yè),很早就遇到微服務(wù)架構(gòu)下

    2024年02月02日
    瀏覽(18)
  • 分布式系統(tǒng)第四講:分布式鎖及實現(xiàn)方案

    本文主要介紹分布式鎖的概念和分布式鎖的設(shè)計原則,以及常見的分布式鎖的實現(xiàn)方式。

    2024年02月12日
    瀏覽(21)
  • 分布式鎖解決方案_Zookeeper實現(xiàn)分布式鎖

    提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 分布式鎖解決方案_Zookeeper實現(xiàn)分布式鎖 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: Zookeeper 是一個開源的分布式協(xié)調(diào)服務(wù),它

    2024年02月03日
    瀏覽(17)
  • 為什么會有分布式鎖?分布式鎖實現(xiàn)方案

    為什么會有分布式鎖?分布式鎖實現(xiàn)方案

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。分布式環(huán)境下會出現(xiàn)資源競爭的地方都需要分布式鎖的協(xié)調(diào)。 分布式鎖的作用:在整個系統(tǒng)提供一個全局、唯一的鎖,在分布式系統(tǒng)中每個系統(tǒng)在進行相關(guān)操作的時候需要獲取到該鎖,才能執(zhí)行相應(yīng)操作。 服務(wù)

    2024年02月08日
    瀏覽(20)
  • 分布式鎖實現(xiàn)方案-基于zookeeper的分布式鎖實現(xiàn)(原理與代碼)

    分布式鎖實現(xiàn)方案-基于zookeeper的分布式鎖實現(xiàn)(原理與代碼)

    目錄 一、基于zookeeper的分布式鎖 1.1 基于Zookeeper實現(xiàn)分布式鎖的原理 1.1.1 分布式鎖特性說明 1.1.1.1 特點分析 1.1.1.2 本質(zhì) 1.1.2 Zookeeper 分布式鎖實現(xiàn)原理 1.1.2.1 Zookeeper臨時順序節(jié)點特性 1.1.2.2 Zookeeper滿足分布式鎖基本要求 1.1.2.3 Watcher機制 1.1.2.3 總結(jié) 1.2 分布式鎖流程說明 1.2.1

    2024年04月24日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包