分布式锁和mysql事物扣库存_高并发场景-订单库存防止超卖

本文介绍了电商系统中如何在高并发场景下防止库存超卖,通过分布式锁防止重复下单并确保库存准确扣减。讨论了不同库存扣减方案,推荐使用Redis原子操作结合SQL乐观锁,先查询Redis库存,不足时再从数据库获取并设置超时,利用Redis incr/decr原子性减少库存,最后通过乐观锁更新数据库库存。同时提出了额外的高并发优化策略,如前端按钮禁用和使用消息队列缓解压力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付。

过程需要检验库存是否足够,保证库存不被超卖。

场景一:买家需要购买数量可以多件

场景二:秒杀活动,到时间点只能购买一件

目的

防止相同用户重复下单

检查库存准确数量

防止扣错库存数量

扣库存时性能效率提升、不阻塞用户

点赞再看,关注公众号:【地藏思维】给大家分享互联网场景设计与架构设计方案

掘金:地藏Kelvin https://juejin.im/user/5d67da8d6fb9a06aff5e85f7

主要解决手段

利用redis的incr、decr的原子性做操作

redis的lpush、rpop的原子性做操作,但是这个只能一个一个的扣,但不能原子地同时扣多个

sql乐观锁

交互流程

b1056d268d2898e0a83ec36f853450ff.png

主要环节:购物车->结清->支付

本文讲述结清时,扣库存环节,分布式系统产生订单环节后续文章再详细分析。

一、防止重复

利用redis分布式锁

用分布式锁,是为了防刷、防止同一个用户同一秒里面把购物车里的商品进行多次结算,防止前端代码出问题触发两次。

利用Jedis客户端编写分布式锁

String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

lockKey是redis的Key,为用户id+商品id+商品数量组成,这样同一秒中只能有一次处理逻辑。

requestId是redis的value,实际是当前线程id,表示有一条线程占用。

大家要注意这种分布式锁写法,是同时设定超时时间的。有些分布式锁的文章可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值