当前位置: 首页 > news >正文

库存扣减

主要解决问题
问题一:性能瓶颈问题
减少锁的竞争
降低数据库行锁开销
雪崩
问题二:数据一致性问题
原子扣减(双重保障)
异步落库的一致性保障
幂等处理
库存回滚
问题三:缓存和数据库双写不一致问题
延时双删(针对先删缓存、再更新数据库的优化)
基于消息队列的异步更新(最终一致性)
强一致性方案(分布式锁 / 读写锁)
问题四:其他相关业务问题
幂等性设计
库存扣减补偿机制
主要解决问题

锁粒度 性能瓶颈问题
锁竞争、数据库行锁开销、雪崩
事务ACID 数据一致性问题
超卖、少卖、库存不一致
缓存和数据库双写不一致问题
数据不一致、库存预热与回退问题
高并发 其他相关业务问题
重复扣款、下单、恶意请求
问题一:性能瓶颈问题
减少锁的竞争
库存分片,通过hash或轮询随机算法等将库存数据分片存储到不同的数据库实例中

如库存总量 1000,分为 10 个段,每段 100)
锁粒度(乐观锁代替悲观锁)

数据库层面使用版本号(version)或 CAS(Compare And Set)方式,避免长事务持有行锁

UPDATE stock SET count = count - #{num}, version = version + 1
WHERE id = #{id} AND version = #{oldVersion} AND count >= #{num}
降低数据库行锁开销
缓存预热 + 异步同步
将库存预热到 Redis,扣减请求先在 Redis 中完成,然后通过消息队列(如 RocketMQ、Kafka)异步将最终结果落库

请求到达 → Redis 扣减(Lua 脚本保证原子性) → 返回成功
发送“库存扣减成功”消息到 MQ
消费端批量消费消息,合并更新数据库(如每 100 条一次批量 update)
数据库行锁优化

确保扣减 SQL 走索引(如主键或唯一索引),避免表锁或间隙锁
使用 SELECT ... FOR UPDATE 时,务必在事务中尽快提交,减少锁持有时间
雪崩

限流->将请求拦截在系统前端,避免直接冲击数据库
(使用令牌桶、漏桶算法,限制单位时间内的请求量,保护后端系统)
熔断降级->当依赖的 Redis 或数据库出现超时、异常时,启动熔断器
多级缓存->
问题二:数据一致性问题

异步落库(导致数据库库存未扣减)
重复扣减
部分失败(扣减库存后,后续业务(如创建订单)失败)
缓存与数据库同步延迟(期间查询可能出现不一致)
原子扣减(双重保障)

Redis Lua 脚本
数据库乐观锁:落库时再次校验库存,防止异步过程中出现超卖
异步落库的一致性保障

本地消息表:在业务数据库中建一张消息表,将扣减记录和消息状态放在同一本地事务中
事务消息
幂等处理

全局唯一流水号:每次扣减操作生成唯一 ID(如订单号+商品ID),在消费端根据流水号去重
Redis 预检查:消费前先查 Redis 是否已处理过该流水号
库存回滚

消息驱动回滚:发送“库存回滚”消息,消费端执行库存增加
定时对账补偿:扫描超时未支付的订单,调用回滚接口
TCC 分布式事务:若业务要求强一致性
通常秒杀场景可接受短暂不一致(最终一致),优先保证高并发

问题三:缓存和数据库双写不一致问题
延时双删(针对先删缓存、再更新数据库的优化)
允许短时间不一致,但希望最终一致

先删除缓存。
更新数据库。
延时一段时间(如 500ms),再次删除缓存

redis.delete(key);
database.update(data);
// 延迟执行,可采用线程池或消息队列
executor.schedule(() -> redis.delete(key), 500, TimeUnit.MILLISECONDS);
基于消息队列的异步更新(最终一致性)
对一致性要求较高,可接受短暂不一致,但需保证最终一致

更新数据库后,发送一条“更新缓存”的消息到消息队列,由消费者异步更新缓存。
若更新失败,可重试
解耦,可靠性高(消息持久化),重试机制保证最终一致性

@Transactional
public void updateData(Data data) {
database.update(data);
// 事务提交后发送消息
transactionSynchronization.registerSynchronization(new TransactionSynchronization() {
public void afterCommit() {
mqSender.send("cache_update", data);
}
});
}
// 消费者
@RabbitListener
public void handleCacheUpdate(Data data) {
redis.set(data.getId(), data);
}
强一致性方案(分布式锁 / 读写锁)
对一致性要求极高(如金融交易),但并发量较低

对同一数据的读写操作加分布式锁,保证同一时刻只有一个线程能读写数据
问题四:其他相关业务问题
幂等性设计
全局唯一流水号:每次扣减请求携带唯一标识(如订单号、业务流水号),在服务端记录已处理的流水号

Redis 去重:使用 Redis SETNX 命令,将流水号作为 key 存储,
设置合理过期时间,重复请求直接拒绝。
数据库去重表:建一张去重表,以流水号作为唯一索引,
扣减前先插入,若主键冲突则说明已处理。
业务状态机:订单状态流转(如待支付、已支付、已取消),只有在特定状态才允许扣减库存,避免重复操作

库存扣减补偿机制
定时任务扫描

定期扫描超时未支付的订单,调用库存服务回滚接口(增加库存)。注意要处理并发问题,避免重复释放
延迟消息

下单成功后发送一条延迟消息
状态机驱动

订单状态变更时(如取消、超时关闭),主动触发库存回滚

http://www.jsqmd.com/news/421363/

相关文章:

  • python基于flask水果商城销售系统-vue pycharm django
  • 2026年2月成都给水管/拉齐管/钢丝骨架管/钢带波纹管/双壁波纹管厂家综合指南 - 2026年企业推荐榜
  • 2026美国藤校申请中介精选,本科高端定制与留学机构推荐 - 品牌2025
  • 导弹防御塔题解
  • 2026年GEO推广企业实力排行榜:地域定向推广/海外精准营销/高ROI推广服务商综合实力排名 - 品牌推荐大师1
  • 从0到1上手RKNN-Toolkit2:AI模型部署全攻略
  • 2026年2月SPET-CT铅门供应商,专业防护与长期稳定供货 - 品牌鉴赏师
  • 2026年免熏蒸木托盘厂家推荐:聚焦湖北林桂与无锡太行,构建适配可靠的供应链选择 - 品牌推荐官
  • 2026年2月东莞防水补漏公司推荐榜,彰显本地服务实力 - 品牌鉴赏师
  • 造物主是不是在“养猪”?我们拼命进化,最后会被“格式化”吗?
  • 2026年电线电缆厂家实力推荐:高温/低烟无卤/铁氟龙/硅胶/PVC/医疗/无人机/机器人线缆及线束加工定制,专业源头工厂精选 - 品牌企业推荐师(官方)
  • 2026年真空抽气机组厂家推荐:靠谱品牌与选型要点 - 品牌推荐大师1
  • 指尖寻趣,解锁惊喜——盲盒扭蛋机小程序前端功能详解
  • MyBatis-Plus使用教程
  • 2026国内专业的德国进口呼吸机品牌哪家好 - 品牌排行榜
  • 2026年全国二手设备回收厂家盘点 靠谱实力厂家汇总及选型参考 覆盖多区域多场景需求 - 深度智识库
  • 2026年 电线电缆厂家推荐排行榜:高温/低烟无卤/铁氟龙/硅胶/PVC/医疗/无人机/机器人/线束加工/定制电线电缆,专业制造与创新应用深度解析 - 品牌企业推荐师(官方)
  • 2026年电线电缆厂家实力推荐榜:涵盖高温/低烟无卤/铁氟龙/硅胶/PVC/医疗/无人机/机器人线缆及线束加工定制,精选耐用可靠工业级线缆解决方案 - 品牌企业推荐师(官方)
  • RK 适配wifi aw-xb327ma-pur
  • 什么是软中断
  • 【E3S出版 | EI检索】第八届环境预防和污染控制技术国际学术会议(EPPCT 2026)
  • 2026年热门之选:优质厂商的高大空间冷暖风机推荐,乏风取热箱/空气幕/干冷器,高大空间冷暖风机厂商哪家好 - 品牌推荐师
  • 2026年2月配重铅板厂家推荐,工业配重专用与质量稳定 - 品牌鉴赏师
  • 扩音器模式经过IIS输出到DAC的声音小
  • 2026年管道供应商新评测:这些管道值得信赖,管件管道直销厂家怎么选择 - 品牌推荐师
  • openclaw问题解决,Rate limit exceeded Error: Rate limit exceeded
  • 这次终于选对AI论文平台,千笔写作工具 VS speedai,本科生写作神器!
  • BUUCTF [NPUCTF2020]这是什么觅 1
  • 2026年K型热电偶厂家推荐:陶瓷热电偶/快速热电偶/B型热电偶厂家精选 - 品牌推荐官
  • 2026年 散热器厂家推荐排行榜:TEC/CPO/手机CPU/泵浦源/共封装光学/半导体/微型无压缩机/多热源耦合/高性能计算芯片/VCSEL芯片散热技术深度解析 - 品牌企业推荐师(官方)