秒殺業務中的庫存扣減為什么不加分布式鎖?

前言

說到秒殺業務的庫存扣減,就還是得先確認我們的扣減基本方案。

秒殺場景的庫存扣減方案

一般的做法是,先在Redis中做扣減,然后發送一個MQ消息,消費者在接到消息之后做數據庫中庫存的真正扣減及業務邏輯操作。

如何解決數據一致性問題:

Redis中庫存成功扣減了,但是后續發送MQ消息失敗,或者后面的消費過程中消息丟了或者失敗了等情況。
就會導致Redis中的庫存被扣減了,但是數據庫庫存沒扣減,業務的實際操作沒發生。這時候的結果就是Redis中發生了多扣,那么帶來的業務問題就是少賣。

對賬機制:
想要解決這類數據不一致的情況,就需要引入一些對賬的機制,做一些準實時的核對,處理這種數據不一致的情況。

常見的對賬方案有,用zset在redis中添加流水記錄,然后定時拉一段時間內的所有記錄,和數據庫比對,發現不一致,則進行補償處理。

一般在成熟的電商公司中,不管前面的方案做的多么完善,這個核對系統都是必不可少的。及時的核對出超賣、少賣等問題。

庫存扣減為什么不用分布式鎖

實現秒殺的庫存扣減,最重要的是兩個點:

  1. 抗更高的并發。
  2. 避免超賣
    尤其重要的就是這個防止超賣,這也是我們加鎖的目的。
    用lua腳本的優勢:
  3. lua腳本具有原子性:可以直接用利用他的原子性特性,在一個腳本中實現庫存的檢查、扣減等動作,避免超賣!
  4. 效率高:所有操作可以在一次腳本執行中完成,減少了網絡傳輸時間和通信次數。
  5. 更加簡潔,易于維護:所有操作可以在一次腳本執行中完成并且使得應用層的代碼。

用分布式鎖的缺點:
如果用了 tryLock,不考慮 waitTime的合理性情況下,和 lua 腳本的執行也差不多,就是排隊執行。

  1. 效率低、增加系統復雜性:在不使用 lua 腳本的情況下,每次庫存扣減操作都需要多次與 Redis 服務器通信(例如,加鎖、讀取庫存、扣減庫存、釋放鎖等)。這不僅增加了網絡延時,還增加了系統的復雜性。
  2. 難管理:分布式鎖需要細致的管理,包括鎖的設置、維護鎖的存活時間、處理死鎖問題等。如果鎖沒有正確管理,可能會導致死鎖或者鎖失效,進而影響系統的穩定性和數據一致性。

總結

本片文章介紹了秒殺業務下的庫存扣減方案,以及扣減的具體方案,解釋了在扣減時為什么不用分布式鎖,而用LUA腳本進行扣減的原因。希望這篇文章能夠幫到你。感謝各位老鐵一鍵三連。

ps: 買服務器返點;收徒中;面試全集在線文檔,需要請私信。

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

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

相關文章

ChatGPT生成測試用例的最佳實踐(一)

前面介紹的案例主要展示了ChatGPT在功能、安全和性能測試用例生成方面的應用和成果。通過ChatGPT生成測試用例,測試團隊不僅可以提升工作效率,還可以加快測試工作的速度,盡早發現被測系統中的問題。問題及早發現有助于提高軟件的質量和用戶滿…

基于Redis實現令牌桶算法

基于Redis實現令牌桶算法 令牌桶算法算法流程圖優點缺點 實現其它限流算法 令牌桶算法 令牌桶是一種用于分組交換和電信網絡的算法。它可用于檢查數據包形式的數據傳輸是否符合定義的帶寬和突發性限制(流量不均勻或變化的衡量標準)。它還可以用作調度算…

操作系統(8)死鎖

一、概念 死鎖是指在一個進程集合中的每個進程都在等待只能由該集合中的其他進程才能引起的事件,而無限期地僵持下去的局面。在多任務環境中,由于資源分配不當,導致兩個或多個進程在等待對方釋放資源時陷入無限等待的狀態,這就是死…

Micropython 擴展C模塊<HelloWorld>

開發環境 MCU:Pico1(無wifi版)使用固件:自編譯版本開發環境:MacBook Pro Sonoma 14.5開發工具:Thonny 4.1.6開發語言:MicroPython 1.24 執行示例 在github上獲取micropython,我使…

并查集基礎

abstract 并查集(Union-Find Set)是一種數據結構,主要用于處理動態連通性問題(Dynamic Connectivity Problem),例如在圖論中判斷兩點是否屬于同一個連通分量,以及動態地合并集合。 它廣泛應用…

CloudberryDB(一)安裝部署多節點分布式數據庫集群

CloudberryDB: 一個 Greenplum Database 分布式數據庫開源版本的衍生項目, 針對開源 Greenplum Database 優化的地方, CloudberryDB制定了路線圖(https://github.com/orgs/cloudberrydb/discussions/369)并在逐步改…

解決Logitech G hub 無法進入一直轉圈的方案(2024.12)

如果你不是最新版本無法加載嘗試以下方案:刪除AppData 文件夾下的logihub文件夾 具體路徑:用戶名根據實際你的請情況修改 C:\Users\Administrator\AppData\Local 如果你有通過lua編譯腳本,記得備份!! ↓如果你是最新…

數據庫范式與反范式化:如何權衡性能與數據一致性

目錄 1. 什么是數據庫范式(Normalization)?第一范式(1NF)第二范式(2NF)第三范式(3NF) 2. 什么是反范式化(Denormalization)?3. 反范式…

Nmap使用總結

0X00 背景 nmap是測試中常用的網絡探測工具,但是這回簡單的操作,一直了解不深入,現在深入的了解和學習一下。 在文章結構上,我把平時常用的內容提前了,以便再次查閱的時候,比較方便。 0X01 安裝 nmap可…

【記錄49】vue2 vue-office在線預覽 docx、pdf、excel文檔

vue2 在線預覽 docx、pdf、excel文檔 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…

MVC模式的理解和實踐

在軟件開發中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一種經典的設計模式&#xff0c;特別適用于構建用戶界面復雜的Web應用程序。MVC通過將應用程序的業務邏輯、數據顯示和用戶交互分離&#xff0c;使代碼結構更加清晰&#xff0c;易于維護和擴展…

[A-22]ARMv8/v9-SMMU多級頁表架構

ver0.1 [看前序文章有驚喜,關注W\X\G=Z+H=“浩瀚架構師”,可以解鎖全部文章] 前言 前文我們對SMMU的系統架構和基本功能做了簡要的介紹,現在大家大致對SMMU在基于ARM體系的系統架構下的總線位置和產品形態有了基本的了解。這里我們還是簡單做個前情回顧,從總線架構角度看…

【UE5 “RuntimeLoadFbx”插件】運行時加載FBX模型

前言 為了解決在Runtime時能夠直接根據FBX模型路徑直接加載FBX的問題&#xff0c;推薦一款名為“RuntimeLoadFBX”的插件。 用法 插件用法如下&#xff0c;只需要指定fbx的地址就可以在場景中生成Actor模型 通過指定輸入參數“Cal Collision”來設置FBX模型的碰撞 還可以通過…

(11)(3.1) ESC接地和接線注意事項

文章目錄 前言 1 歸納 2 電容式 3 電阻 前言 ESC 接地問題由 3 種形式的 ESC 信號/耦合問題組成&#xff0c;即電阻、電容和電感。在制造飛機時&#xff0c;應考慮這三個因素。 1 歸納 這是電流突然變化導致系統中出現大電壓尖峰的趨勢。電源系統中的電感主要是由 ESC 和…

精品基于Python實現的微信小程序校園導航系統-微信小程序

[含文檔PPT源碼等] [包運行成功永久免費答疑輔導] 《django微信小程序校園導航系統》該項目采用技術Python的django框架、mysql數據庫 &#xff0c;項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、核心代碼介紹視頻等 軟件開發環境及開發工具&#xf…

Rstudio-server的安裝、配置、維護

一、安裝Rstudio-server (1)安裝R語言&#xff1a; sudo apt install r-base # 如果沒有管理員權限無法操作 # 這樣裝上R默認在/usr/bin/R其實基本上的流程都可以參考posit的官網&#xff08;也就是Rstudio的官網&#xff09;&#xff1a; https://posit.co/download/rstudio…

Python序列的應用(八):元組、字典

前言&#xff1a;在Python編程語言中&#xff0c;序列是一種非常重要的數據結構&#xff0c;它允許我們存儲和操作有序的數據集合。在前幾期的內容中&#xff0c;我們已經探討了列表&#xff08;List&#xff09;和集合&#xff08;Set&#xff09;這兩種序列的應用&#xff0c…

OpenCV 功能函數介紹

一&#xff0c; 二值化函數 功能&#xff1a; 用于對圖像進行二值化處理 參數&#xff1a; cv2.threshold(輸入你的圖像所對應的灰度圖&#xff0c; 閾值&#xff1a;是浮點還是整數取決予圖像的數據類型 最大值;高于閾值的像素值&#xff0c; 閾值類型&#xff1a;cv2.THR…

【Python】使用Selenium的find_element模塊獲取網頁上的大段文字和表格的方法(建議收藏!)

發現了一個使用Selenium的find_element模塊&#xff0c;快速獲取文字和表格的方法&#xff0c;很實在&#xff0c;以后爬網的時候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起來用了&#xff01; 文字部分&#xff1a;實現網絡節點下&#xff0c;某個節點下的其…

APP滲透測試記錄(一、Android應用基本構造)

Android應用基本構造 雷電模擬機進入 adb shell# 如果不是root權限 su一下 su 1.了解APK文件 安卓應用的擴展名為.apk(Android Application Package),它是一個包含多個文件和文件夾的數據存檔文件。 1.1 apk文件解壓后的目錄結構 AndroidManifest.xml:包含應用的大部分…