库存扣多了,到底怎么办

面试官:电商库存扣减如何设计?如何防止超卖? 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段。还是使用数据库,但是将库存分成多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。将库存放到redis使用redis的incrby特性来扣减库存。 阅读详情

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:

调用层,一般是处于端上的浏览器或者App;
站点层,一般是拼装html或者json返回的web-server层;
服务器,一般是提供RPC调用接口的service层;
数据层,提供固化数据存储的db

对于库存业务,一般有个库存服务(stock-service)提供库存的查询get stock、扣减reduce stock、设置set stock等RPC接口。

库存查询,stock-service本质上执行的是:

select num from stock where id=$id;

库存扣减,stock-service本质上执行的是:

update stock set num = num - $reduce where id=$id;

库存设置,stock-service本质上执行的是:

update stock set num = $new_num where id=$id;

用户下单前,一般会对库存进行查询,有足够的存量才允许扣减。

但是在并发量很大的情况下,会有问题:比如2个并发操作,查询库存,得到的值都是5。接下来用户发生了并发的购买动作(秒杀类业务特别容易出现):
用户1购买了3个,于是库存修改为2;
用户2购买了2个,于是库存要修改为3。

这2个修改库存的接口并发执行,库存会先变成2,再变成3,导致数据不一致,(实际卖出了5件商品,但是库存只扣减了2)。

其根本原因是,修改库存操作发生的时候,没有检查库存和查询出来的库存有没有变化。
升级库存设置接口也很容易:

update stock set num = $new_new where id=$id and num = $old_num;

这就是大家常说的Compare And Set(CAS),是一种常见的降低读写锁冲突、保证数据一致性的方法。

Redis 如何实现库存扣减操作? 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。 阅读详情

相关推荐

【面试题】电商库存扣减如何设计?如何防止超卖?

使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段。还是使用数据库,但是将库存分成多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。将库存放到redis使用redis的incrby特性来扣减库存。

wjianwei666的专栏 271

使用乐观锁和 CAS 技术解决超卖问题

1.1超卖问题的产生在秒杀或抢购活动中,由于用户并发请求过多,多个线程可能同时读取到相同的库存数据,导致库存数量被多个线程同时修改。这样就容易出现“库存变成负数”的情况,即产生了超卖问题。当多个用户几乎同时提交秒杀请求时,如果没有合适的库存锁机制,所有线程会读取到同样的库存数,并尝试同时进行扣减操作。结果就是库存被重复扣减,导致卖出的数量超过了实际库存,造成库存混乱。1.2解决超卖的常见方法使用数据库的行锁或分布式锁来防止多个线程同时修改库存。

Takumilove的博客 1406

库存扣减——如何处理扣多了

在业务复杂,数据量大,并发量大的情况下,库存扣减容易引发数据的不一致,常见的优化方案有两个: • 调用“设置库存”接口,能够保证数据的幂等性 • 在实现“设置库存”接口时,需要加上原有库存的比较,才允许设置成功,能解决高并发下库存扣减的一致性问题

库存扣减还有这么多方案? | 架构师之路

昨天一篇《库存扣多了,到底怎么整》,核心观点是:用“设置库存”替代“扣减库存”,以保证幂等性使用CAS乐观锁,在“设置库存”时加上原始库存的比对,避免数据不一致文章非常多...

shenjian58的博客 1120

InventoryManagementSystem:使用 NodeJS、Express 和 Amazon RDS 构建的用于持久性的库存管理系统

杂货店的 Node.js 库存管理系统 经理可以用于杂货店的库存管理系统,用于查看商店库存中的物品。 经理还可以向库存添加商品、更新商品的价格以及在杂货店不再提供商品时删除商品。 该应用程序还提供了跟踪每件产品超过 5 美元的价格上涨的选项。 这将有助于进一步分析,如果价格上涨超过 20 美元,这将有助于防止价格欺诈。 该项目有一个登录和注册页面,用于对经理进行身份验证。 管理者需要在登录系统前进行自我注册。 演示视频可在以下查看: : 系统的 ER 图可以在以下位置找到: : 用户故事 实现了以下功能: - [X] Login - [X] Inventory Tracking - [X] Add Items - [X] View Items - [X] Delete Items - [X] Update Price of an Item - [X] Tr

inventory-app:用 NodeJS 编写的库存应用程序

库存应用 用 NodeJS 编写的库存应用程序。 可在 Heroku 上轻松部署,使用 MongoDB 实现数据持久性。 演示: :

扣减库存(高并发更新数据库都可使用)

通过以上处理,基本可以保证下单扣减库存的准确性,但是对于“秒杀”,依然存在风险,例如两个用户同时抢购,都拿到了库存数量为10的商品,其中一个用户购买了5件商品,随后更新库存数量为5件;因为,“扣减”操作不是幂等的,如果接口设计的不够完美,没有考虑幂等性,那么在由于网络原因或者其他原因造成重试之后,会出现重复“扣减”,导致“超卖”,甚至库存为负数的情况。如果只是简单的一个扣减库存的操作,可以先将库存数量直接放到缓存中,然后利用分布式缓存,例如大名鼎鼎的Redis,去应对这种高并发情况下的系统挑战。

weixin_51977686的博客 981

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3812

Java电商库存扣减实现

业务需求:做了一个商城系统,在下单库存扣减时存在超卖问题,决定采用乐观锁保证数据一致。

weixin_57911375的博客 2881

VI恒流源原理详细分析(0~10V转0/4~20mA)

但是此电阻也不能无限增加,首先我们所列方程均是基于运放虚短虚断的假设,此假设又是基于运放输入阻抗无穷大,输出阻抗无穷小的前提条件,然而实际的运放并非理想运放,对于TL082IDR这款运放,其Rid(Common-mode input resistance)典型值为1TΩ,以此来看感觉1MΩ确实还不是很大,但是还有另一个影响因素需要考虑,那就是电路的抗干扰能力,原则上,电阻越大受到外部干扰的可能性越大。也就是实现Uin 0~10V变化时对应Iout 0~20mA的一个线性对应关系。

IOTBOT的博客 2896

MAIXCAM无线连接实战:5分钟搞定远程调试与代码烧录(避坑版)

本文提供了一份详细的MAIXCAM无线连接实战指南,帮助嵌入式视觉开发者快速配置远程调试与代码烧录。文章重点介绍了通过MaixHub IDE进行Wi-Fi配置、建立远程终端连接、使用SFTP进行文件传输以及管理自启动应用程序的完整流程,并针对IP地址变动、信号中断等常见问题提供了实用的避坑解决方案,旨在提升开发效率与灵活性。

weixin_29188043的博客 296

浅谈电商场景中的扣除库存问题

电商场景中扣库存需要考虑秒杀高并发、事务一致性等场景,需要根据业务和场景来选择不同的方案。

wlphlj的专栏 2938

TMC5160 StallGuard2调参避坑指南:从SG_RESULT飘忽不定到稳定检测堵转

本文详细解析了TMC5160的StallGuard2功能在堵转测试中的调参技巧,从SG_RESULT波动问题到稳定检测的完整解决方案。通过电流环与反电动势分析、电源噪声处理及低速校准法等实用方法,帮助工程师实现工业级可靠的堵转检测,避免误触发和检测失效问题。

weixin_28727975的博客 377

库存扣多了,到底怎么整

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层: 调用层,一般是处于端上的browser或者APP 站点层,一般是拼装html或者json返回的web-server层 服务层,一般是提供RPC调用接口的service层 数据层,提供固化数据存储的db 对于库存业务,一般有个库存服务,提供库存的查询、扣减、设置等RPC...

HelloWorld搬运工 2907

realsense D455深度相机+YOLO V5结合实现目标检测(一)

realsense D455深度相机+YOLO V5结合实现目标检测代码来源环境配置代码分析:1.如何用realsense在python下面调用的问题:2.对main_debug.py文件的分析:结束语 可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。 说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影

文一生 3万+

从D3 00到FF FF:手把手解析RTCM3.2协议帧结构(附Python解析代码)

本文深入解析RTCM3.2协议帧结构,从同步头标识到CRC校验算法,详细讲解如何通过Python代码实现二进制数据解析。文章包含完整的RTCM3.2解析器实现,涵盖消息类型解码、CRC校验等关键步骤,并附赠特定消息类型(如1005型基准站坐标)的解析示例,帮助开发者快速掌握GNSS差分数据传输协议的核心技术。

weixin_42550052的博客 352

库存扣多了,到底咋整?

库存扣多了,到底咋整? 业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层: 调用层,一般是处于端上的browser或者APP 站点层,一般是拼装html或者json返回...

191

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 457

库存扣多了,到底怎么整 | 架构师之路

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:调用层,一般是处于端上的browser或者APP站点层,一般是拼装html或者json返回...

shenjian58的博客 823

YOLO26科研升级:OREPA在线重参数化,让模型精度在训练中持续跃升

在目录下,新建AddModules文件夹,将orepa.py放入其中。

LXY_LOVE36的博客 98

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

架构师之路(10)库存扣多了,到底咋整?

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层: 调用层,一般是处于端上的browser或者APP 站点层,一般是拼装html或者json返回的web-server层 服务层,一般是提供RPC调用接口的service层 数据层,提供固化数据存储的db 对于库存业务,一般有个库存服务,提供库存的查询、扣

babyZeng 627

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

库存,余额等扣减在高并发场景下如何避免超卖以及多扣

分别从数据库以及缓存讲述了超卖的解决方案

q1002377826的博客 893

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

系统重试,导致库存扣多啦,怎么办(两行代码破解)?(第41讲)

《架构师之路:架构设计中的100个知识点》41.重复扣减大家有没有遇到过,库存异常的情况:1. 系统重试,导致库存扣了多次;2. 系统并发,导致库存设置错误;今天和大家聊一聊库存扣减里的方案设计。库存微服务一般提供什么接口?提供库存的查询、扣减、设置等RPC接口:1. 库存查询接口,微服务一般执行:select num from stock where sid=$sid2. 库存扣减接口,微服务一...

shenjian58的博客 2395
上一篇: Memcache 内存分配策略
下一篇: session一致性架构设计实践
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值