精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高并發業務下的庫存扣減方案

開發 架構
商品庫存數據在DB最終會落到單庫單表的一行數據。無法通過分庫分表提高請求的并行度。而在單節點場景,數據庫吞吐遠不如Redis。最基礎的原因:IO效率不是一個量級,DB是磁盤操作,而且還可能要多次讀盤,Redis是一步到位的內存操作。

扣減庫存需要查詢庫存是否足夠:

  • 足夠就占用庫存
  • 不夠則返回庫存不足(這里不區分庫存可用、占用、已消耗等狀態,統一成扣減庫存數量,簡化場景)

并發場景,若 查詢庫存和扣減庫存不具備原子性,就可能超賣,而高并發場景超賣概率會增高,超賣數額也會增高。處理超賣的確麻煩:

  • 系統全鏈路刷數會很麻煩(多團隊協作),客服外呼也有額外成本
  • 最主要原因,客戶搶到訂單又被取消,嚴重影響客戶體驗,甚至引發客訴產生公關危機

實現邏輯

常用方案redis+lua,借助redis單線程執行+lua腳本中的邏輯,可在一次執行中順序完成的特性達到原子性(叫排它性更準確,因為不具備回滾動作,異常情況需自己手動編碼回滾)。

lua腳本基本實現

圖片圖片

-- 1. 獲取庫存緩存key KYES[1] = hot_{itemCode-skuCode}_stock
local hot_item_stock = KYES[1]

-- 2. 獲取剩余庫存數量
local stock = tonumber(redis.call('get', hot_item_stock))

-- 3. 購買數量
local buy_qty = tonumber(ARGV[1])

-- 4. 如果庫存小于購買數量,則返回1,表達庫存不足
if stock < buy_qty then
  return 1
end

-- 5. 庫存足夠,更新庫存數量
stock = stock - buy_qty
redis.call('set', hot_item_stock, tostring(stock))

-- 6. 扣減成功則返回2,表達庫存扣減成功
return 2

但腳本還有一些問題:

  • 不具備冪等性,同個訂單多次執行會導致重復扣減,手動回滾也無法判斷是否會回滾過,會出現重復增加的問題
  • 不具備可追溯性,不知道庫存被誰被哪個訂單扣減了

增強后的lua腳本:

-- 1. 獲取庫存扣減記錄緩存 key KYES[2] = hot_{itemCode-skuCode}_deduction_history
local  hot_deduction_history = KYES[2]

-- 2. 使用 Redis Cluster hash tag 保證 stock 和 history 在同一個槽
local exist = redis.call('hexists', hot_deduction_history, ARGV[2])
-- 3. 請求冪等判斷,存在返回0,表達已扣減過庫存
if exist == 1 then return 0 end

-- 4. 獲取庫存緩存key KYES[1] = hot_{itemCode-skuCode}_stock
local hot_item_stock = KYES[1]

-- 5. 獲取剩余庫存數量
local stock = tonumber(redis.call('get', hot_item_stock))

-- 6. 購買數量
local buy_qty = tonumber(ARGV[1])

-- 7. 如果庫存小于購買數量 則返回1,表達庫存不足
if stock < buy_qty then return 1 end

-- 8. 庫存足夠
-- 9. 1.更新庫存數量
-- 10. 2.插入扣減記錄 ARGV[2] = ${扣減請求唯一key} - ${扣減類型} 值為 buy_qty
stock = stock - buy_qty
redis.call('set', hot_item_stock, tostring(stock))
redis.call('hset', hot_deduction_history, ARGV[2], buy_qty)

-- 11. 如果剩余庫存等于0則返回2,表達庫存已為0
if stock == 0 then return 2 end

-- 12. 剩余庫存不為0返回 3 表達還有剩余庫存
return 3 end

利用Redis Cluster hash tag保證stock和history在同個槽,這樣lua腳本才能正常執行。

因為正常要求 Lua 腳本操作的鍵必須在同一個 slot 中。

@Override
public <T, R> RFuture<R> evalReadAsync(String key, Codec codec, RedisCommand<T> evalCommandType, String script, List<Object> keys, Object... params) {
 NodeSource source = getNodeSource(key);
 return evalAsync(source, true, codec, evalCommandType, script, keys, false, params);
}

 private NodeSource getNodeSource(String key) {
     int slot = connectionManager.calcSlot(key);
     return new NodeSource(slot);
 }”

利用hot_deduction_history,判斷扣減請求是否執行過,以實現冪等性。

借助hot_deduction_history的V值判斷追溯扣減來源,如:用戶A的交易訂單A的扣減請求,或用戶B的借出單B的扣減請求。

回滾邏輯先判斷hot_deduction_history里有沒有 ${扣減請求唯一key}:

  • 有,則執行回補邏輯
  • 沒有,則認定回補成功

但該邏輯依舊有漏洞,如(消息亂序消費),訂單扣減庫存超時成功觸發了重新扣減庫存,但同時訂單取消觸發了庫存扣減回滾,回滾邏輯先成功,超時成功的重新扣減庫存就會成為臟數據留在redis里。

處理方案

有兩種:

  • 追加對賬,定期校驗hot_deduction_history中數據對應單據的狀態,對于已經取消的單據追加一次回滾請求,存在時延(業務不一定接受)以及額外計算資源開銷
  • 使用順序消息,讓扣減庫存、回滾庫存都走同一個MQ topic的有序隊列,借助MQ消息的有序性保證回滾動作一定在扣減動作后面執行,但有序串行必然帶來性能下降

高可用

Redis終究是內存,一旦服務中斷,數據就消失。所以需要追加保護數據不丟失的方案。

運用Redis部署的高可用方案:

  • 采用Redis Cluster(數據分片+ 多副本 + 同步多寫 + 主從自動選舉)
  • 多寫節點分(同城異地)多中心防止意外災害

定期歸檔冷數據。定期 + 庫存為0觸發redis數據往DB同步,流程如下:

圖片圖片

CDC分發數據時,秒殺商品,hot_deduction_history的數據量不高,可以一次全量同步。但如果是普通大促商品,就需要再追加一個map動作分批處理,以保證每次執行CDC的數據量恒定,不至于一次性數據量太大出現OOM。代碼如下:

/**
 * 對任務做分發
 * @param stockKey 目標庫存的key值
 */
public void distribute(String stockKey) {
    final String historyKey = StrUtil.format("hot_{}_deduction_history", stockKey);
    // 獲取指定庫存key 所有扣減記錄的key(生產請分頁獲取,防止數據量太多)
    final List<String> keys = RedisUtil.hkeys(historyKey, stockKey);
    // 以 100 為大小,分片所有記錄key
    final List<List<String>> splitKeys = CollUtil.split(keys, 100);
    // 將集合分發給各個節點執行
    map(historyKey, splitKeys);
}

/**
 * 對單頁任務做執行
 * @param historyKey 目標庫存的key值
 * @param stockKeys 要執行的頁面大小
 */
public void mapExec(String historyKey, List<String> stockKeys) {
    // 獲取指定庫存key 指定扣減記錄 的map
    final Map<String, String> keys = RedisUtil.HmgetToMap(historyKey, stockKeys);
    keys.entrySet()
        .stream()
        .map(stockRecordFactory::of)
        .forEach(stockRecord -> {
            // (冪等 + 去重) 扣減 + 保存記錄
            stockConsumer.exec(stockRecord);
            // 刪除redis中的 key 釋放空間
            RedisUtil.hdel(historyKey, stockRecord.getRecordRedisKey());
        });
}

為啥不走DB

商品庫存數據在DB最終會落到單庫單表的一行數據。無法通過分庫分表提高請求的并行度。而在單節點場景,數據庫吞吐遠不如Redis。最基礎的原因:IO效率不是一個量級,DB是磁盤操作,而且還可能要多次讀盤,Redis是一步到位的內存操作。

同時,一般DB都是提交讀隔離級別,為保證原子性,執行庫存扣減,得加鎖,無論悲觀樂觀。不僅性能差(搶不到鎖要等待),而且因為非公平競爭,易出現線程饑餓。而redis是單線程操作,不存在共享變量競爭。

有些優化思路,如合并扣減,走批降低請求的并行連接數。但伴隨的集單的時延,以及按庫分批的訴求;還有拆庫存行,商品A100個庫存拆成2行商品A50庫存,然后扣減時分發請求,以提高并行連接數(多行可落在不同庫來提高并行連接數)。但伴隨的:

  • 復雜的庫存行拆分管理(把什么庫存行在什么時候拆分到哪些庫)
  • 部分庫存行超賣的問題(加鎖優化就又串行了,不加總量還有庫存,個別庫存行不足是允許一定系數超賣還是返回庫存不足就是一個要決策的問題)

部分頭部電商采用弱緩存抗讀(非庫存不足,不實時更新),DB抗寫的方案。該方案前提在于,通過一系列技術方案,流量落到庫存已相對低且平滑了(扛得住,不用再自己實現操作原子性)。

作者簡介:魔都架構師,多家大廠后端一線研發經驗,在分布式系統設計、數據平臺架構和AI應用開發等領域都有豐富實踐經驗。

各大技術社區頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統性能優化
  • 活動&券等營銷中臺建設
  • 交易平臺及數據中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連接平臺、大數據平臺架構設計及優化
  • LLM Agent應用開發
  • 區塊鏈應用開發
  • 大數據開發挖掘經驗
  • 推薦系統項目

目前主攻市級軟件項目設計、構建服務全社會的應用系統。

參考:編程嚴選網

責任編輯:武曉燕 來源: JavaEdge
相關推薦

2022-09-19 09:49:17

MCube網絡引擎

2021-08-26 08:24:33

高并發秒殺系統

2021-06-09 18:52:05

方案設計庫存數

2017-06-16 16:16:36

庫存扣減查詢

2025-03-11 08:36:52

高并發場景性能

2025-06-27 02:00:00

Spring高并發庫存

2025-01-27 00:40:41

2025-02-26 08:10:40

2024-06-20 07:59:49

2025-03-10 09:20:00

庫存異常Redis架構

2024-10-10 08:32:28

Redis高并發Lua

2024-01-31 13:02:00

高并發熱點散列庫存分桶

2025-03-31 10:42:31

2023-10-07 08:54:28

項目httpPost對象

2025-01-20 00:00:03

高并發秒殺業務

2012-04-24 09:30:57

淘寶開發

2022-03-31 17:38:09

高并發系統架構設計負載均衡
點贊
收藏

51CTO技術棧公眾號

精品97人妻无码中文永久在线| 深夜黄色小视频| 色视频在线看| 理论片日本一区| 欧美激情手机在线视频| 91成年人网站| 日本一区影院| 色天使久久综合网天天| 狠狠干视频网站| 精品电影在线| 成人黄色av电影| 国产精品一区电影| 圆产精品久久久久久久久久久| 成人在线免费观看91| 亚洲国产精品久久久久| 日本不卡一区二区在线观看| 不卡专区在线| 亚洲精品亚洲人成人网| 日韩三级电影| 天堂网av在线播放| 美女任你摸久久| 欧美一级视频在线观看| 久久久一区二区三区四区| 成人免费电影网址| 精品爽片免费看久久| 欧美性猛交乱大交| 欧美黑粗硬大| 91国内精品野花午夜精品| 精品视频在线观看一区| av在线下载| 国产精品超碰97尤物18| 欧美一区二区综合| 无码精品在线观看| 国产99一区视频免费| 91夜夜揉人人捏人人添红杏| 正在播放亚洲精品| 日韩av电影一区| 日韩av观看网址| 国产精品999在线观看| 伊人久久成人| 欧美日韩国产二区| 天天看片中文字幕| 亚洲国产精品91| 精品国产网站地址| 亚洲精品电影院| 日韩精品免费一区二区在线观看| 日韩av一区二区在线观看| 日本久久久久久久久久| 亚洲视频国产| 亚洲精品一区二区精华| 在线播放第一页| 成人三级毛片| 亚洲国产成人av在线| 亚洲自拍偷拍精品| 欧美午夜寂寞| 亚洲欧洲xxxx| 少妇精品无码一区二区免费视频| 国产剧情在线观看一区| 亚洲欧美国产一本综合首页| 国产熟妇搡bbbb搡bbbb| 老司机精品视频在线播放| 亚洲精品久久久久久久久久久久| 日韩免费高清一区二区| 婷婷成人综合| 亚洲人成网站999久久久综合| 波多野结衣a v在线| 视频一区欧美| 日韩中文字幕视频| 国产探花在线播放| 亚洲精品乱码| 国产精品高潮呻吟久久av无限 | 有坂深雪av一区二区精品| 一级一片免费播放| av中文在线资源| 午夜亚洲国产au精品一区二区| 欧美成人高潮一二区在线看| 在线天堂资源www在线污| 色婷婷综合久色| 天天色综合天天色| 欧美电影院免费观看| 精品处破学生在线二十三| 懂色av粉嫩av蜜乳av| 欧美成人精品一区二区三区在线看| 久久精品小视频| 日本一级淫片免费放| 美日韩精品视频| 91色精品视频在线| 午夜影院在线视频| 国产精品嫩草99a| 日韩极品视频在线观看| 自拍一区在线观看| 欧美一区二区啪啪| 国产精品三级在线观看无码| 欧美激情电影| 欧洲成人午夜免费大片| 国产精品一区二区三区在线免费观看| 国产成人日日夜夜| 日本一区二区三区视频免费看| 国产精品实拍| 一本久久综合亚洲鲁鲁五月天| 久久6免费视频| 欧美调教视频| 精品中文字幕在线观看| 无码人妻丰满熟妇区五十路 | 精品91在线| 国产精品日韩电影| 无码精品黑人一区二区三区 | 久久99精品久久久野外观看| 国产婷婷97碰碰久久人人蜜臀| 免费看特级毛片| 久久九九精品| 国产精品12| 麻豆视频网站在线观看| 色综合久久中文综合久久牛| 成人啪啪18免费游戏链接| 菠萝蜜一区二区| 午夜精品久久久久久99热软件| 一级黄色短视频| 91麻豆精东视频| 欧美久久在线观看| 久久久91麻豆精品国产一区| 国产午夜精品美女视频明星a级| 国产精品第一页在线观看| 国内不卡的二区三区中文字幕| 日本一区高清不卡| 热色播在线视频| 亚洲高清一区二| 久久精品国产亚洲av麻豆色欲| 极品少妇一区二区| 午夜一区二区三视频在线观看| 日韩伦理在线一区| 亚洲第一二三四五区| 免费无码毛片一区二区app| 久久99国内精品| 亚洲欧洲免费无码| avav成人| 最近2019中文字幕mv免费看| 久久影视中文字幕| 国产无一区二区| 大肉大捧一进一出好爽动态图| eeuss鲁片一区二区三区| 欧美激情影音先锋| 成人免费视频国产免费麻豆| 亚洲一区在线观看网站| 无码人妻一区二区三区一| 亚洲欧美综合| 国产精品久久久久久久久婷婷| 性直播体位视频在线观看| 678五月天丁香亚洲综合网| 国产美女高潮视频| 狠狠色综合播放一区二区| 一区二区视频在线观看| 色诱色偷偷久久综合| 久久亚洲国产成人| 国产人妻精品一区二区三| 日韩理论片在线| 中文字幕在线观看视频www| 欧美激情自拍| 国产伦理久久久| 欧美激情护士| 一区二区三区日韩在线| 一区二区自拍偷拍| 成人欧美一区二区三区白人| 久久精品一卡二卡| 亚洲久久一区二区| 欧美欧美一区二区| 久久er热在这里只有精品66| 久久资源免费视频| 后入内射欧美99二区视频| 欧美日韩中文字幕| 日韩欧美在线视频播放| 国产成人在线网站| 鲁一鲁一鲁一鲁一澡| 成人激情诱惑| 波多野结衣成人在线| 台湾佬中文娱乐网欧美电影| 伊人男人综合视频网| av网站在线免费看| 欧美日韩亚洲视频一区| 日本黄色网址大全| 国产一区美女在线| 日韩精品xxxx| 国产精品精品| 韩国成人一区| 日韩电影免费观看高清完整版在线观看| 麻豆国产精品va在线观看不卡| 日韩一区免费视频| 欧美图片一区二区三区| 国产第一页在线播放| 国产视频911| 少妇愉情理伦片bd| 麻豆精品网站| 久久久久福利视频| 欧美日韩国产高清电影| 草莓视频一区| 国产精品亲子伦av一区二区三区| 欧美国产日本在线| 超碰国产在线| 亚洲精美色品网站| 国产日韩一级片| 色综合天天综合色综合av| 五月天婷婷色综合| 久久久久9999亚洲精品| 少妇熟女视频一区二区三区| 日本vs亚洲vs韩国一区三区| 国产av国片精品| 久久影院一区| 欧洲一区二区在线观看| 在线一区二区三区视频| 国产精品欧美激情| 亚洲欧美se| 久久久久久久久久av| 麻豆电影在线播放| 国产午夜精品免费一区二区三区 | 国产精品免费精品一区| 中文字幕亚洲在| 久久亚洲无码视频| 91免费版在线看| 国产黑丝一区二区| 国产成人自拍网| 香蕉网在线视频| 老司机精品视频导航| 欧美性猛交xxx乱久交| 国产欧美一区二区三区国产幕精品| 天天综合中文字幕| 久久精品国产www456c0m| 日韩av一区二区三区在线| 色爱av综合网| 美乳视频一区二区| 丝袜美腿综合| 精品一区国产| 色综合久久中文| 国产女主播一区二区三区| 一区视频网站| 国产精品久久久久久久久婷婷| 麻豆一区在线| 亚洲最大成人免费视频| 国产精品久一| 亚洲aa中文字幕| 欧美影院视频| 不卡视频一区二区| 中文字幕区一区二区三| 国产成人精品免费视频大全最热| 日韩欧美中文字幕在线视频| 3d蒂法精品啪啪一区二区免费| 成人精品在线| 成人精品一二区| 999久久久精品一区二区| 成人欧美一区二区三区视频| 亚洲五码在线| 国产亚洲一区在线播放 | 国产一区久久久| 一级黄色大片免费看| 成人免费视频网站在线观看| 人妻体内射精一区二区三区| 99久久精品免费看国产 | 成人免费一区二区三区视频| 久久国产波多野结衣| 夜夜揉揉日日人人青青一国产精品| 免费一级黄色大片| 天天综合网天天综合色| 日本免费精品视频| 欧美年轻男男videosbes| 国产喷水吹潮视频www| 欧美精品一区二区三区在线| 色就是色亚洲色图| 丝袜美腿亚洲一区二区| 二区三区在线观看| 国内精品400部情侣激情| 色是在线视频| 国产日韩av在线播放| 一区二区三区在线免费看| 免费看国产精品一二区视频| 国语产色综合| 白白操在线视频| 国产欧美另类| 91精品999| 99视频精品全部免费在线| 国产人妻大战黑人20p| 最新日韩在线视频| 可以在线观看av的网站| 精品视频1区2区| 二区三区在线视频| 在线精品国产欧美| 超级碰碰不卡在线视频| 国产成人精品国内自产拍免费看| 日韩成人综合网| 久久99精品久久久久久秒播放器 | 日韩一级片免费视频| 日韩成人精品在线观看| 国产伦理在线观看| 中文字幕精品综合| 国产真实夫妇交换视频| 欧美在线观看一区| 欧美一级性视频| 精品国内自产拍在线观看| 忘忧草在线日韩www影院| 444亚洲人体| 成人在线视频免费观看| 亚洲国产精品无码观看久久| 久久精品国产一区二区三| 欧亚乱熟女一区二区在线| 国产精品夫妻自拍| 中文字幕视频网| 精品久久久久久久久久久久久久久久久| 久色视频在线| 91精品国产乱码久久久久久蜜臀 | 蜜臀久久久99精品久久久久久| 国产污在线观看| 亚洲天堂精品视频| 中文字幕一区二区三区四区视频 | 天堂在线中文网官网| 91国产丝袜在线放| 欧美电影免费播放| 男女曰b免费视频| 99久久精品国产毛片| 久久久久亚洲av片无码下载蜜桃| 欧美精品欧美精品系列| 国产精品视频二区三区| 97在线免费视频| 99a精品视频在线观看| 亚洲国产一二三精品无码| 美女免费视频一区二区| 日本一卡二卡在线播放| 日韩欧美国产中文字幕| 婷婷综合激情网| 高清一区二区三区四区五区| 亚洲图色一区二区三区| 奇米777四色影视在线看| 久久er精品视频| 日本女人性生活视频| 欧美亚洲免费在线一区| 国产高清一级毛片在线不卡| 日韩美女免费线视频| 久久99国产成人小视频| 国产亚洲天堂网| 久久免费午夜影院| 日韩在线视频不卡| 国产香蕉精品视频一区二区三区| 亚洲涩涩在线| 区一区二区三区中文字幕| 久久精品123| 日韩女同一区二区三区| 欧美午夜影院一区| 五月香视频在线观看| 国产日韩欧美综合| 天天做综合网| 91人妻一区二区三区| 亚洲国产日韩av| 天堂中文在线8| 日本欧美一二三区| 人人狠狠综合久久亚洲婷婷| 欧美大尺度做爰床戏| 自拍偷拍亚洲综合| 丰满肥臀噗嗤啊x99av| 亚洲**2019国产| 国产99久久| 国产又大又黄又猛| 亚洲精品日韩专区silk| 免费观看国产精品| 欧美在线激情网| 日本一二区不卡| 香蕉视频xxx| 调教+趴+乳夹+国产+精品| 欧美孕妇孕交| 成人精品久久一区二区三区| 欧美日本一区二区视频在线观看 | 国产欧美日韩专区发布| 在线精品国产| av网站免费在线播放| 欧美视频日韩视频| 日韩另类在线| 日本一区二区三区精品视频| 国精产品一区一区三区mba桃花| 免费人成年激情视频在线观看| 亚洲老司机av| 只有精品亚洲| 黄色片网址在线观看| 国产精品视频yy9299一区| 国产三级第一页| 午夜精品久久久久久久久久久久| 狠狠做深爱婷婷综合一区| 婷婷中文字幕在线观看| 欧美性猛交xxx| av网站在线免费| 欧美精品免费观看二区| 国产乱子轮精品视频| 国产精品久久久久久久久久久久久久久久久 | 蜜桃精品在线观看| 国产大片中文字幕在线观看| 在线观看欧美日韩国产| 99精品国产高清一区二区麻豆| 动漫av免费观看| 亚洲一区二区三区国产| 成人动漫在线免费观看| 国产专区一区二区| 国产精品一区在线| 中文字幕欧美色图| 欧美中文字幕视频| 欧美三级特黄|