当前位置:首页 > 科技  > 软件

电商并发减库存设计,如何做到不超卖

来源: 责编: 时间:2024-07-12 17:24:25 813观看
导读前言高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列);我们这里使用redis来解决问题1、思路:1)触发

前言

高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列);hRi28资讯网——每日最新资讯28at.com

我们这里使用redis来解决问题

1、思路:

1)触发开始开团的同时,把库存数量更新到id对应的队列上去(定时更新,或者手动更新)hRi28资讯网——每日最新资讯28at.com

2)用户请求接口,如果队列长度>0,移除一个队列记录,同时对数据库进行相应操作hRi28资讯网——每日最新资讯28at.com

3)如果队列长度<=0,拦截用户的访问,返回‘无库存’hRi28资讯网——每日最新资讯28at.com

2、重点设计在数据库层面

2张表:hRi28资讯网——每日最新资讯28at.com

第一张:判重表(buy_record),该用户有没秒杀过该商品hRi28资讯网——每日最新资讯28at.com

字段: id, uid, goods_id, addtimehRi28资讯网——每日最新资讯28at.com

第二张表:商品表 goodshRi28资讯网——每日最新资讯28at.com

字段:goods_id goods_numhRi28资讯网——每日最新资讯28at.com

方案一

start transaction;  select id from buy_record where uid=$uid and goods_id=$goods_id;  if(结果不为空)      抛异常,回滚。  insert into buy_record。。。  if(受影响行数<=0)          抛异常,回滚。。。    select goods_num from goods where goods_id=$good_id;  if(库存<=0)          抛异常,回滚。。。    update goods set goods_num=goods_num-1 where goods_id=$goods_id;  if(受影响行数<=0)      该方法在高并发下几乎必然导致超卖。当库存为1的时候刚好多个用户同时    select goods_num from goods where goods_id=$good_id;此时库存刚好大于0,做update操作的时候必然减到小于0.  同时上面进行是否秒杀过的判重同样会出现类似问题

方案二

start transaction;    select id from buy_record where uid=$uid and goods_id=$goods_id          for       update        ;  if(结果不为空)    抛异常,回滚。insert into buy_record。。。if(受影响行数<=0)    抛异常,回滚。。。    select goods_num from goods where goods_id=$good_id    for update    ;  if(库存<=0)    抛异常,回滚。。。    update goods set goods_num=goods_num-1     where goods_id=$goods_id    ;  if(受影响行数<=0)    抛异常,回滚。。。
该方法有效的防止了超卖,但是在每次select的时候加上了排它锁,每次select操作都会被堵塞    ,并发性能大大降低。

方案三

对(uid,goods_id)加唯一索引!!        start transaction;      insert into buy_record。。。    if(唯一索引报错?)      抛异常,已经秒过了,回滚。。。            update goods set goods_num=goods_num-1                         where goods_id=$goods_id          and                goods_num>0            ;        if(受影响行数<=0)      抛异常,商品秒完了,回滚。。。

该方法完美的解决了超卖与select排它锁导致的并发低的问题,并且4个sql缩减成2个sql语句。极大提升性能。hRi28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100723-0.html电商并发减库存设计,如何做到不超卖

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringBoot强大的分布式锁组件Lock4j,支持多种实现

下一篇: React 支持 Form Action 是在作妖?不,它是一种重磅回归

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top