秒杀业务中的库存扣减为什么不加分布式锁?

前言

说到秒杀业务的库存扣减,就还是得先确认我们的扣减基本方案。

秒杀场景的库存扣减方案

一般的做法是,先在Redis中做扣减,然后发送一个MQ消息,消费者在接到消息之后做数据库中库存的真正扣减及业务逻辑操作。

如何解决数据一致性问题:

Redis中库存成功扣减了,但是后续发送MQ消息失败,或者后面的消费过程中消息丢了或者失败了等情况。

就会导致Redis中的库存被扣减了,但是数据库库存没扣减,业务的实际操作没发生。这时候的结果就是Redis中发生了多扣,那么带来的业务问题就是少卖。

对账机制:

想要解决这类数据不一致的情况,就需要引入一些对账的机制,做一些准实时的核对,处理这种数据不一致的情况。

常见的对账方案有,用zset在redis中添加流水记录,然后定时拉一段时间内的所有记录,和数据库比对,发现不一致,则进行补偿处理。

一般在成熟的电商公司中,不管前面的方案做的多么完善,这个核对系统都是必不可少的。及时的核对出超卖、少卖等问题。

库存扣减为什么不用分布式锁

实现秒杀的库存扣减,最重要的是两个点:

  1. 抗更高的并发。
  2. 避免超卖
    尤其重要的就是这个防止超卖,这也是我们加锁的目的。
    用lua脚本的优势:
  3. lua脚本具有原子性:可以直接用利用他的原子性特性,在一个脚本中实现库存的检查、扣减等动作,避免超卖!
  4. 效率高:所有操作可以在一次脚本执行中完成,减少了网络传输时间和通信次数。
  5. 更加简洁,易于维护:所有操作可以在一次脚本执行中完成并且使得应用层的代码。

用分布式锁的缺点:

如果用了 tryLock,不考虑 waitTime的合理性情况下,和 lua 脚本的执行也差不多,就是排队执行。

  1. 效率低、增加系统复杂性:在不使用 lua 脚本的情况下,每次库存扣减操作都需要多次与 Redis 服务器通信(例如,加锁、读取库存、扣减库存、释放锁等)。这不仅增加了网络延时,还增加了系统的复杂性。
  2. 难管理:分布式锁需要细致的管理,包括锁的设置、维护锁的存活时间、处理死锁问题等。如果锁没有正确管理,可能会导致死锁或者锁失效,进而影响系统的稳定性和数据一致性。

总结

本片文章介绍了秒杀业务下的库存扣减方案,以及扣减的具体方案,解释了在扣减时为什么不用分布式锁,而用LUA脚本进行扣减的原因。希望这篇文章能够帮到你。感谢各位老铁一键三连。

ps: 买服务器返点;收徒中;面试全集在线文档,需要请私信。

相关推荐
小坏讲微服务14 小时前
Spring Cloud Alibaba整合 Kafka 的完整实现
分布式·spring cloud·kafka·消息队列·springboot·linq
zl97989915 小时前
RabbitMQ-延迟队列
分布式·rabbitmq
-大头.16 小时前
深入解析ZooKeeper核心机制
分布式·zookeeper·wpf
s***45319 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
jinxinyuuuus19 小时前
Info Flow:分布式信息采集、数据去重与内容分级的工程实现
人工智能·分布式·程序人生·生活
WHFENGHE1 天前
输电线路分布式故障定位在线监测装置:技术解析与实际应用价值
分布式
BD_Marathon1 天前
【Kafka】
分布式·kafka
FinTech老王1 天前
集中式 vs 分布式数据库:金融用户如何选择?——金仓数据库的双架构实践与选型指南
数据库·分布式·金融
Roye_ack1 天前
【黑马点评 - 高级篇】Redis分布式缓存原理(Redis持久化 RDB AOF + 主从集群 哨兵 分片集群 + 多级缓存)
redis·分布式·缓存·aof·redis持久化·rdb·redis主从哨兵分片集群
b***59431 天前
分布式WEB应用中会话管理的变迁之路
前端·分布式