# 《Seckill秒杀系统》第46章:基于Lua脚本设计并实现库存防超卖

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/13L0kFdkn (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★★☆☆
  • 本章重点:基于Lua脚本实现下单扣减库存时的防超卖方案,重点掌握基于Lua脚本实现商品防超卖的原理和方法,并能将其灵活运用到自身实际项目中。
  • 课程视频:https://t.zsxq.com/13L0kFdkn (opens new window)

大家好,我是冰河~~

在前面的文章中,基于数据库和分布式锁设计并实现了商品库存的防超卖效果,其实在真实场景下,基于数据库实现库存防超卖是作为最终的兜底方案,基于分布式锁实现库存防超卖的方案中,由于添加分布式锁后的程序只能串行执行,会影响程序执行的性能。

# 一、前言

在前面的文章中,分别基于数据库和分布式锁设计并实现了商品库存的防超卖效果。基于数据库实现库存防超卖是作为最终的兜底方案,基于分布式锁实现库存防超卖的方案中,由于添加分布式锁后的程序只能串行执行,会影响程序执行的性能。本章,我们就继续使用另一种方案设计并实现库存防超卖。

# 二、本章诉求

在秒杀系统中,除了基于数据库和分布式锁可以实现商品库存的防超卖方案外,基于Lua脚本也可以实现库存防超卖。Redis能够保证Lua脚本执行过程中的原子性,正是由于这种Lua脚本在Redis中执行的特性,可以基于Lua脚本实现商品库存的防超卖方案,并且性能比基于数据库和分布式锁实现商品库存防超卖的方案更高。本章,就基于Lua脚本设计并实现库存防超卖的方案。

# 三、流程设计

本节,就从下单流程扩展设计,下单减库存流程设计和下单减库存类结构设计三个方面对流程设计进行简单的介绍。

# 3.1 下单流程扩展设计

在下单扣减库存的流程设计中,最终会实现多种方案来防止商品超卖问题,本章,会基于Lua脚本设计并实现商品库存防超卖,除此之外,还会有其他的方案实现商品库存防超卖。如图46-1所示。


在库存防超卖的设计中,会借助SpringBoot的@ConditionalOnProperty注解为每种设计方案的实现指定配置项和对应的Value值,比如基于Lua脚本设计并实现商品库存防超卖的方案借助@ConditionalOnProperty注解指定的配置项为place.order.type,配置的Value值为lua。

此时,当SpringBoot的application.yml或者application.properties中的place.order.type配置项的值为lua时,项目在启动时,就会默认加载并实例化基于Lua脚本设计并实现商品库存防超卖的方案实现类。最终就会基于Lua脚本实现商品库存防超卖的方案。

# 3.2 下单减库存流程设计

在秒杀系统中,基于Lua脚本实现库存防超卖时,下单减库存的流程设计如图46-2所示。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码