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

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

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

前言

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

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

1、思路:

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top