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

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

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

前言

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

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

1、思路:

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

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

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

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

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

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

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

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

字段:goods_id goods_numx6F28资讯网——每日最新资讯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语句。极大提升性能。x6F28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
Top