秒殺系統解決兩個核心問題的思路方法總結:1.庫存超賣問題;2.用戶重復搶購問題。

秒殺系統解決兩個核心問題

  • 秒殺系統解決兩個核心問題:
    • 一、解決庫存超賣的核心邏輯:
      • 解釋:
      • 原子性保證:
    • 二、如何避免重復搶購:
      • 使用 Redis 做唯一標識判斷
      • 優點:
    • 三、流程完整梳理:
    • 四、通過數據庫建立唯一索引避免(用戶重復搶購)
      • 原因背景
      • 如何通過數據庫唯一索引避免重復下單?
      • 程序中如何體現這一機制?
      • 配合使用 Redis + 唯一索引實現雙重保障

秒殺系統解決兩個核心問題:

  1. 庫存超賣問題
  2. 用戶重復搶購問題

一、解決庫存超賣的核心邏輯:

關鍵點:數據庫層面的原子性更新 + 樂觀鎖判斷庫存是否充足

seckillGoodsService.update(new UpdateWrapper<SeckillGoods>().set("stock_count", seckillGoods.getStockCount()).eq("id", seckillGoods.getId()).gt("stock_count", 0)
);

解釋:

  • eq("id", ...): 保證更新的是這條商品記錄。
  • gt("stock_count", 0): 加了一條庫存大于 0 的條件,防止庫存為 0 仍被減。

這個 update() 方法只有在滿足條件(也就是庫存大于 0)時才會成功返回 true,否則不更新。

原子性保證:

這個 UPDATE 操作由數據庫完成,是原子性的,同時加了條件判斷,避免并發環境下出現超賣問題


二、如何避免重復搶購:

使用 Redis 做唯一標識判斷

String seckillOrderJson = (String) redisTemplate.opsForValue().get("order:" + user.getId() + ":" + goodsId);
if (!StringUtils.isEmpty(seckillOrderJson)) {return RespBean.error(RespBeanEnum.REPEATE_ERROR);
}

優點:

  • Redis 訪問速度極快,適合做高并發下的搶購標記。
  • 提前判斷用戶是否已搶過,無需再查數據庫,提高性能。

三、流程完整梳理:

用戶請求 /seckill/doSeckill 接口↓
校驗用戶是否登錄↓
查詢商品庫存(goodsService.findGoodsVoByGoodsId)↓
判斷庫存是否為 0↓
從 Redis 判斷用戶是否已經下過單(防止重復搶購)↓
調用 service 層下單邏輯(orderService.seckill)↓① 減庫存(update + gt 判斷)② 生成訂單、秒殺訂單入庫③ 將訂單信息寫入 Redis 標記用戶已搶購↓
返回下單成功 / 失敗信息

四、通過數據庫建立唯一索引避免(用戶重復搶購)

在這個秒殺系統中,其實是非常關鍵的一步,是防止同一用戶對同一商品生成多個秒殺訂單的最終兜底措施


原因背景

在高并發環境下,即使你在代碼中已經通過 Redis 判斷是否重復下單:

String seckillOrderJson = (String) redisTemplate.opsForValue().get("order:" + user.getId() + ":" + goodsId);
if (!StringUtils.isEmpty(seckillOrderJson)) {return RespBean.error(RespBeanEnum.REPEATE_ERROR);
}

由于 Redis 與數據庫之間存在一定的 時延,仍可能出現“并發搶購成功但生成了兩個訂單”的情況 —— 即所謂的并發穿透檢查邏輯


如何通過數據庫唯一索引避免重復下單?

seckill_order 表結構如下:

CREATE TABLE seckill_order (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT NOT NULL,goods_id BIGINT NOT NULL,order_id BIGINT NOT NULL,-- 其他字段 ...UNIQUE KEY uniq_user_goods (user_id, goods_id)
);

關鍵:

UNIQUE KEY uniq_user_goods (user_id, goods_id)

它的作用是:同一個用戶,對同一件商品,只能有一條秒殺訂單記錄
也就是說,如果你嘗試插入相同 user_idgoods_id 的數據,就會違反唯一索引,導致 SQL 執行失敗。


程序中如何體現這一機制?

OrderServiceImpl.java 的代碼中:

SeckillOrder seckillOrder = new SeckillOrder();
seckillOrder.setOrderId(order.getId());
seckillOrder.setUserId(user.getId());
seckillOrder.setGoodsId(goods.getId());
seckillOrderService.save(seckillOrder); // 插入數據庫

這個 save 方法其實最終是調用 MyBatis-Plus 的 INSERT 操作。如果用戶在極端并發下重復插入,就會因為違反唯一索引而拋出異常。


配合使用 Redis + 唯一索引實現雙重保障

  • Redis:攔截大部分重復請求,提升性能
  • 數據庫唯一索引:兜底保障,防止極端并發場景中出現重復訂單

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

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

相關文章

【集成電路版圖設計學習筆記】3.基本電路元件(MOS,電容,電阻)

一、MOSFET 在版圖設計中&#xff0c;要定義一個mosfet&#xff0c;最關鍵的層次是polysilicon&#xff08;多晶硅&#xff09;和active&#xff08;有源區&#xff09;。用有源區定義了一個矩形的區域&#xff0c;在這個區域內才可以形成一個有源器件&#xff0c;然后再用多晶…

藍橋杯之差分題型

一維差分 問題描述 給定一個長度為 nn 的序列 aa。 再給定 mm 組操作&#xff0c;每次操作給定 33 個正整數 l,r,dl,r,d&#xff0c;表示對 al~ral~r? 中的所有數增加 dd。 最終輸出操作結束后的序列 aa。 Update&#xff1a;由于評測機過快&#xff0c;n,mn,m 于 2024…

深入剖析 C/S 與 B/S 架構及網絡通信基礎

目錄 C/S 架構詳解? 概念與示例? 優點? B/S 架構詳解? 概念與示例? 優勢? 缺點? C/S 與 B/S 的區別? 架構組成? 使用場景? 開發和維護? 安全性? 網絡通信基礎? IP 地址? MAC&#xff08;物理地址&#xff09;? 端口? 路由器? 網關? 子網掩…

常見免殺框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】

一、AniYaGUI1.2.0免殺框架 環境&#xff1a;虛擬機Win10 、云服務器 工具&#xff1a;Xshell、CobaltStrike 項目下載地址&#xff1a; https://github.com/piiperxyz/AniYa 1. 安裝Go語言環境 確保Win10虛擬機安裝 Golang 且環境變量中包含 go 否則?法編譯&#xff08;注…

Apache HTTPD 換行解析漏洞

漏洞介紹 CVE-2017-15715 Apache HTTPD 是一個廣泛使用的 HTTP 服務器&#xff0c;可以通過 mod_php 模塊來運行 PHP 網頁。在其 2.4.0 到 2.4.29 版本中存在一個解析漏洞&#xff0c;當文件名以 1.php\x0A 結尾時&#xff0c;該文件會被按照 PHP 文件進行解析&#xff0c;這…

常用開發環境/工具版本選擇(持續更新中)

操作系統&#xff1a;Ubuntu Server Version&#xff08;LTS&#xff09;Latest Sub VerRelease Time24.04(Noble Numbat)24.04.22025-02-1622.04(Jammy Jellyfish)22.04.52024-09-1120.04(Focal Fossa)20.04.62023-03-1418.04(Bionic Beaver)18.04.62021-09-1516.04.7(Xenial…

STM32 認識STM32

目錄 什么是嵌入式&#xff1f; 認識STM32單片機 開發環境安裝 安裝開發環境 開發板資源介紹 單片機開發模式 創建工程的方式 燒錄STM32程序 什么是嵌入式&#xff1f; 1.智能手環項目 主要功能有&#xff1a; 彩色觸摸屏 顯示時間 健康信息&#xff1a;心率&#…

C#核心筆記——(六)框架基礎

我們在編程時所需的許多核心功能并不是由C#語言提供的,而是由.NET Framework中的類型提供的。本節我們將介紹Framework在基礎編程任務(例如虛的等值比較、順序比較以及類型轉換)中的作用。我們還會介紹Framework中的基本類型,例如String、DateTime和Enum. 本章中的絕大部分…

AI——K近鄰算法

文章目錄 一、什么是K近鄰算法二、KNN算法流程總結三、Scikit-learn工具1、安裝2、導入3、簡單使用 三、距離度量1、歐式距離2、曼哈頓距離3、切比雪夫距離4、閔可夫斯基距離5、K值的選擇6、KD樹 一、什么是K近鄰算法 如果一個樣本在特征空間中的k個最相似&#xff08;即特征空…

transient關鍵字深度解析

Java transient 關鍵字深度解析 transient(意思:瞬時的,瞬間的) 1. 核心概念 (1) 基本定義 作用:標記字段不參與序列化 適用場景: 敏感數據(如密碼、密鑰) 臨時計算字段 依賴運行時環境的字段(如Thread對象) (2) 語法示例 java public class User implements Se…

信刻電子檔案藍光光盤刻錄安全檢測長期歸檔

信刻一直致力于為檔案館、各行業檔案部門&#xff0c;提供跨網數據交換、電子檔案數據磁光異質備份歸檔解決方案。所研制的電子檔案光盤智能長期歸檔系統&#xff0c;滿足國產環境下”刻、管、存、檢、用”全生命周期管理應用需求&#xff0c;能夠提供一份離線歸檔、一份近線存…

Word 中“母版頁”的等效機制

Word 和 PowerPoint 不太一樣——**Word 實際上沒有像 PowerPoint 那樣的“母版頁&#xff08;Master Page&#xff09;”**功能。但它有1個和“母版頁”功能類似的東西&#xff0c;可能造成你看到的“校徽自動出現在每一頁”的現象&#xff1a; ? Word 中“母版頁”的等效機制…

Go:反射

為什么使用反射 在編程中&#xff0c;有時需編寫函數統一處理多種值類型 &#xff0c;這些類型可能無法共享同一接口、布局未知&#xff0c;甚至在設計函數時還不存在 。 func Sprint(x interface{}) string {type stringer interface {String() string}switch x : x.(type) …

SS25001-多路復用開關板

1 概述 1.1 簡介 多路復用開關板是使用信號繼電器實現2線制的多路復用開關板卡&#xff1b;多路復用開關是一種可以將一個輸入連接到多個輸出或一個輸出連接到多個輸入的拓撲結構。這種拓撲通常用于掃描&#xff0c;適合將一系列通道自動連接到公共線路的的設備。多路復用開…

vue3 nprogress 使用

nprogress 介紹與作用 1.nprogress 是一個輕量級的進度條組件&#xff0c;主要用于在頁面加載或路由切換時顯示一個進度條&#xff0c;提升用戶體驗。它的原理是通過在頁面頂部創建一個 div&#xff0c;并使用 fixed 定位來實現進度條的效果 2.在 Vite Vue 3 項目中&#xf…

Jsp技術入門指南【六】jsp腳本原理及隱式對象

Jsp技術入門指南【六】jsp腳本原理及隱式對象 前言一、JSP 腳本元素1.1 聲明1.2 表達式1.3 腳本標簽 二、JSP 的隱式對象是什么三、隱式對象詳解outrequestsessionapplicationconfigexception 前言 在之前的博客中&#xff0c;我們已經介紹了JSP的環境搭建、編譯文件查找以及生…

vue3推薦的移動table庫

vxe-table https://gitee.com/js-class/vxe-table#https://gitee.com/link?targethttps%3A%2F%2Fvxetable.cn 文檔api https://vxetable.cn/#/component/table/other/bookkeepingVoucher 引入步驟 安裝 npm install xe-utils vxe-tablenext 在項目main.js引入 import …

HOOPS Exchange 與HOOPS Communicator集成:打造工業3D可視化新標桿!

一、概述 在工業3D開發、BIM建筑、數字孿生和仿真分析等高端應用場景中&#xff0c;數據格式復雜、模型體量龐大、實時交互體驗要求高&#xff0c;一直是困擾開發者的難題。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator&#xff0c;正是解決這類問題的黃金搭檔。二者…

《軟件設計師》復習筆記(14.3)——設計模式

目錄 一、設計模式分類 1. 創建型模式&#xff08;Creational Patterns&#xff09; 2. 結構型模式&#xff08;Structural Patterns&#xff09; 3. 行為型模式&#xff08;Behavioral Patterns&#xff09; 真題示例&#xff1a; 一、設計模式分類 架構模式 高層設計決…

HarmonyOS:使用Refresh組件實現頁面下拉刷新上拉加載更多

一、前言 可以進行頁面下拉操作并顯示刷新動效的容器組件。 說明 該組件從API Version 8開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。該組件從API Version 12開始支持與垂直滾動的Swiper和Web的聯動。當Swiper設置loop屬性為true時&…