商品庫存扣減方案

文章目錄

  • 1. Lua腳本 + Redis(業界首選,綜合最優)
  • 2. Redis原子命令(DECRBY + 結果校驗)
  • 3. Redis事務(MULTI/EXEC)
  • 4. 分布式鎖(基于Redis實現)
  • 5. Redisson客戶端封裝(Java生態首選)
  • 6. 數據庫事務 + Redis雙寫
  • 業界主流:

1. Lua腳本 + Redis(業界首選,綜合最優)

核心邏輯:將“檢查庫存→扣減庫存→返回結果”的完整邏輯用Lua腳本編寫,通過Redis的 EVAL 命令執行,利用Redis對Lua腳本的原子性支持(整個腳本作為單個命令執行,不被其他請求打斷)。
優勢

  • 原子性最強:天然避免并發沖突,從根本上解決超賣問題;
  • 靈活性高:支持復雜邏輯(如庫存閾值校驗、階梯扣減、關聯優惠券判斷等);
  • 性能最優:一次網絡請求完成所有操作,減少IO開銷;
  • 兼容性好:不依賴特定語言或客戶端,所有Redis客戶端都支持。
    適用場景:幾乎所有庫存扣減場景,尤其是高并發秒殺、促銷活動(如淘寶雙11、京東618的核心庫存邏輯)。
    業界案例:阿里云秒殺系統、京東商品庫存核心模塊、微信支付庫存校驗。

2. Redis原子命令(DECRBY + 結果校驗)

核心邏輯:直接使用Redis的 DECRBY 命令扣減庫存,通過返回結果判斷是否成功(若結果≥0則成功,否則回滾)。
優勢:實現最簡單,單命令性能極致,適合超高并發場景;
缺點:邏輯逆向(先扣減再判斷),可能出現短暫負庫存(需立即回滾),不支持扣減前的復雜校驗。
適用場景:超高并發且邏輯極簡的場景(如秒殺活動的第一道庫存攔截)。
業界案例:部分秒殺系統的前置過濾層、簡單商品的快速庫存扣減。

3. Redis事務(MULTI/EXEC)

核心邏輯:通過 MULTI 標記事務,將“查庫存→扣庫存”命令放入隊列,EXEC 一次性執行。
優勢:原生支持,無需額外依賴,適合中小并發場景;
缺點:需在客戶端二次判斷庫存(樂觀鎖機制),不支持復雜邏輯,執行失敗時需手動回滾。
適用場景:并發量不高、邏輯簡單的普通商品下單(如日均訂單量10萬級以下的電商)。

4. 分布式鎖(基于Redis實現)

核心邏輯:用 SET key value NX PX 獲取分布式鎖,確保同一時間只有一個線程操作庫存,執行“查庫存→扣庫存”后釋放鎖。
優勢:支持復雜業務邏輯(如結合用戶權限、訂單狀態校驗);
缺點:實現復雜(需處理鎖超時、重入、誤釋放等問題),性能損耗較高(加鎖/釋放鎖開銷)。
適用場景:需要結合復雜業務規則的庫存扣減(如VIP用戶優先扣減、關聯訂單狀態的庫存調整)。
業界案例:部分電商的訂單確認環節(需關聯物流、優惠券等多維度校驗)。

5. Redisson客戶端封裝(Java生態首選)

核心邏輯:通過Redisson提供的 RSemaphore(信號量)或 RLock(分布式鎖),底層自動實現原子性操作(內部基于Lua腳本或Redis命令)。
優勢:封裝完善,簡化分布式鎖、原子操作的開發(如自動續期、重入鎖);
缺點:僅限Java生態,靈活性略低(依賴客戶端實現)。
適用場景:Java技術棧項目,希望減少手動處理分布式問題的場景。

6. 數據庫事務 + Redis雙寫

核心邏輯:以MySQL等數據庫為權威數據源,通過數據庫事務保證庫存扣減原子性,同步更新Redis緩存(最終一致性)。
優勢:強一致性(數據庫事務保證),適合對數據可靠性要求極高的場景;
缺點:性能差(數據庫成為瓶頸),Redis與數據庫可能存在短暫不一致。
適用場景:并發量低、高價值商品(如奢侈品、珠寶)的庫存管理。

業界主流:

  • 絕對主流Lua+Redis 是高并發庫存扣減的事實標準,幾乎所有大型電商、秒殺系統的核心庫存邏輯都采用此方案(兼顧原子性、性能、靈活性)。
  • 補充方案:原子命令(DECRBY)用于極致性能場景,分布式鎖用于復雜業務場景,數據庫事務僅用于低并發、高價值商品場景。

簡單說:Lua+Redis = 庫存扣減的“最優解”,是業界處理高并發庫存問題的首選技術方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96666.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于在阿里云DMS誤操作后如何恢復數據的記錄

前言 昨天因客戶員工操作錯誤,導致快遞單號和訂單互換。客戶員工那邊讓筆記修改數據。 于是筆者寫下如下SQL來操作,導致了災難性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系統核心知識梳理】線程(Thread)重點與易錯點全面總結

在多任務操作系統中,線程是比進程更輕量的執行單元,理解線程的特性和實現方式是掌握并發編程的基礎。本文系統梳理了線程相關的核心知識點和常見誤區,助你夯實操作系統基礎。一、線程的基本概念與引入目的 1.1 什么是線程? 線程是…

深入理解 Python 中的 `__call__` 方法

化身為可調用的對象:深入理解 Python 中的 __call__ 方法 引言:函數與對象的邊界模糊化 在 Python 中,我們最熟悉的概念莫過于函數(Function) 和對象(Object)。函數是可調用的(calla…

云服務器使用代理穩定與github通信方法

使用SSH反向隧道 (SSH Reverse Tunneling) 利用SSH連接在您的本地電腦和云服務器之間建立一個反向的加密通道。 原理: 從本地電腦發起一個SSH命令到您的云服務器,這個命令會告訴云服務器:“請監聽您自己的某個端口(例如&#xff1…

7.k8s四層代理service

Service的基本介紹 Cluster IP:每個 Service 都分配了一個Cluster IP,它是一個虛擬的內部IP地址,用于在集群內部進行訪問。這個虛擬IP是由Kubernetes自動分配的,并且與Service對象一一對應。 端口映射:Service可以映射…

Qt 工程中 UI 文件在 Makefile 中的處理

Qt 工程中 UI 文件在 Makefile 中的處理 在 Qt 工程中,.ui 文件(Qt Designer 界面文件)需要通過 uic(用戶界面編譯器)工具轉換為對應的頭文件。以下是幾種情況下如何處理 UI 文件:1. 使用 qmake 自動生成 M…

ZLMediaKit性能測試

一、環境 系統:虛擬機 Ubuntu22.04 64bit配置: 4核8G設置:ulimit -n 102400 二、安裝 依賴安裝sudo apt update sudo apt install ffmpeg sudo apt install nloadzlm服務安裝參考:https://blog.csdn.net/hanbo622/article/details/149064939?…

智能文檔處理業務,應該選擇大模型還是OCR專用小模型?

智能文檔處理業務中,最佳策略不是二選一,而是“大小模型協同”。用專用小模型處理高頻、標準化的核心文檔流,實現極致效率與成本控制;用大模型賦能非標、長尾文檔的靈活處理,加速業務創新。 OCR小模型會被大模型取代嗎…

android 如何判定底部導航欄顯示時 不是鍵盤顯示

在 Android 中判定底部導航欄是否顯示時,核心痛點是 區分 “導航欄的底部 Insets” 和 “軟鍵盤彈出的底部 Insets”—— 兩者都會導致 getSystemWindowInsetBottom() 返回非零值,直接判斷會誤將鍵盤彈出當成導航欄顯示。以下是基于 WindowInsets 類型區…

你知道服務器和電腦主機的區別嗎?

我們都知道服務器和臺式主機有著不同之處,但具體說出個一二三來很多人還是一頭霧水,也就是知其然不知其所以然,都是CPU主板 內存 硬盤 電源,撐死就差一個顯卡不同,但其實服務器和我們正常使用的臺式主機差距很大&#…

什么是包裝類

什么是包裝類 在Java中,包裝類(Wrapper Class)是為基本數據類型提供的對應的引用類型。Java中的基本數據類型(如int、char、boolean等)不是對象,為了在需要對象的場景中使用基本數據類型(如集合…

用Python打造專業級老照片修復工具:讓時光倒流的數字魔法

在這個數字化時代,我們手中珍藏著許多泛黃、模糊、甚至有劃痕的老照片。這些照片承載著珍貴的回憶,但時間的侵蝕讓它們失去了往日的光彩。今天,我將帶您一起用Python開發一個專業級的老照片修復工具,讓這些珍貴的記憶重現光彩。為…

linux中查找包含xxx內容的文件

linux中怎么查找哪個文件包含xxx內容 在Linux中查找包含特定內容的文件 在Linux系統中,有幾種常用方法來查找包含特定內容的文件。以下是幾種最有效的方法:1. 使用 grep 命令(最常用) 基本語法:bash grep -r "搜索…

sklearn 加州房價數據集 fetch_california_housing 出錯 403: Forbidden 修復方案

問題 加載加州房價數據時出現 403 錯誤 HTTP Error 403: Forbidden from sklearn.datasets import fetch_california_housingcalifornia fetch_california_housing() print(california.target.shape) 解決方案 運行下述代碼,然后再運行上述的 fetch_california_hou…

嵌入式學習---(硬件)

1、在LED實驗中,在對Soc引腳配置時都做了哪些工作?復用功能配置操作寄存器:IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03將引腳的低 4 位設置為 0101,將引腳復用為 GPIO 功能電氣特性配置操作寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1…

微信小程序開發教程(十一)

目錄:1.上拉觸底案例-初步實現上拉觸底效果2.上拉觸底案例-添加loading效果3.上拉觸底案例-節流處理4.擴展-自定義編譯模式1.上拉觸底案例-初步實現上拉觸底效果頁面加載的時候調用這個方法:設置樣式:下拉觸底后繼續調用獲取顏色的方法2.上拉…

Android相機API2,基于GLSurfaceView+SurfaceTexture實現相機預覽,集成的相機算法采用GPU方案,簡要說明

Android相機API2,基于GLSurfaceViewSurfaceTexture實現相機預覽,集成的相機算法采用GPU方案,簡要流程如下(不疊加相機算法的預覽顯示流程也大體如此,只是去掉了算法部分):進入相機:1,新建實現了…

[code-review] 日志機制 | `LOG_LEVEL`

第6章:日志機制(調試) 歡迎來到我們了解ChatGPT-CodeReview項目的最后一章 在第5章:文件過濾邏輯(范圍管理器)中,我們學習了機器人如何智能地決定哪些文件需要發送給AI審查。 但一旦機器人開…

n8n工作流平臺入門學習指南

目錄 1、基礎背景 2、核心概念 2.1 節點(Nodes) 2.2 連接(Connections) 2.3 工作流(Workflows) 3、常用節點說明 4、基于Docker快速部署 5、學習資料 6、常見問題 強烈推薦,大家不懂的直接問:N8N大師(GPT),科…

【Oracle經驗分享】字符串拼接過長問題的解決方案 —— 巧用 XMLAGG

📑 目錄🔍 問題背景?? 常見拼接方式的限制💡 XMLAGG 的解決方案📝 示例代碼📌 注意事項? 總結🔍 問題背景在日常開發中,我們經常需要把多行數據拼接成一個字符串。例如將某個字段的多條記錄拼…