通过本节能学到什么?

什么是抢购的超卖现象?

常见的解决思路有哪些?最好的解决思路是什么?

1、引出问题:

在做抢购系统的时候,我们首先应该想到的是怎么才能避免超卖,比如说:库存只有100,结果卖了200。这种情况肯定是不能接受的。如果我们不在代码中针对该问题进行相应处理,很有可能就会造成这种不良后果。

比如:

MySQL,Redis常见错误处理方式,下面用伪代码来展示下:

# 查询数据库存放的库存

$goods_num = $this->goods_db->get_goods_num($goods_id);

# 判断库存

if($goods_num >=1)

{

# 用户和该订单绑定等处理

# 减库存

}

?>

如上就是我们最常见的处理方式。我们来分析下上面这段代码是怎么造成超卖问题的。当剩余库存为1 ,同时有两名用户请求数据。此时他们同时走到第6行代码,因为此时他们从第3行代码查询到的库存都是1,所以都进入到了if语句里面。都进行了减库存处理,导致库存变成了-1。

2、怎么解决?

首先我们要明确解决该问题的核心原则:于所有的用户对于库存的读写操作必须是串行的!

举例理解:

并行:多位用户同时检查库存,发现有剩余之后同时减库存。如上面的伪代码就是并行。

串行:用户1检查库存--有剩余之后减库存--用户2检查库存--有剩余之后减库存--用户3检查库存--有剩余之后减库存...... 如果回归到上面的伪代码上,就意味着上面的伪代码要执行的话,必须一个人接一个人的执行,不能多人同时执行。

上面已经有了“天上飞的”,下面相应的就要有“地上跑的”

方案:

方案一:Mysql中可以应用悲观锁和乐观锁。

因为该方式不是最好的实现方式,不再展开去讲,可以参考该文章了解下。

方案二(最好):Redis的消息队列。

还是用php代码来处理下:

#########################后台创建商品侧################################################

# 在创建商品库存的时候,同时创建一个该商品的redis list key ,来存放该商品所有的库存。

$goods_num = 100;

$goods_id = 1;

$goods_list_key = 'goods_num:'.$goods_id;

for($i=0; $i

{

$Redis->Lpush($goods_list_key,1);

}

# 经过上面一番操作,$goods_list_key已经存放了100个元素,每个元素都是1

#########################################################################

......

#########################前台用户抢购商品侧###############################################

$goods_id = 1;

$goods_list_key = 'goods_num:'.$goods_id;

$user_get_goods = $Redis->Lpop($goods_list_key);

if(!empty($user_get_goods)))

{

# 用户和商品建立绑定关系

# 减库存(到MySQL或者Redis减库存都行,不过一般这种落地数据都会采用放到MySQL中)

}

#########################################################################

?>

下面来分析下,上面这段代码是如何避免掉超卖问题的。

当商品的库存只剩下1的时候,此时有两位用户同时来取商品。第一个用户把库存取走(pop)之后;第二个用户再来取库存(pop)的时候,发现什么也没取到,那么就直接返回就行,也不需要再去减库存。

拓展:

注意实际项目中一般稍微复杂一点,还有加一条逻辑:一位用户只能取一个商品,多次来的请求并不能多次取商品。这条也非常常见的要求,毕竟万一有用户来刷,没有限制的话,所有商品可能都被该用户取走。

思路:只需要在进行领取之前查询下用户是否已经领取过即可

实际场景:

最近做了一个需求,虽然不是抢购,但是也是有库存限制。由于没有针对超卖问题进行处理,就出现了库存为-1的情况。如上面优化之后就没有问题了。

参考文档:

mysql乐观锁 超卖_秒杀系统之超卖现象相关推荐

  1. java秒杀怎么防止超卖_秒杀系统是如何防止超卖的?

    秒杀系统介绍 秒杀系统相信网上已经介绍了很多了,我也不想黏贴很多定义过来了. 废话少说,秒杀系统主要应用在商品抢购的场景,比如: 电商抢购限量商品 卖周董演唱会的门票 火车票抢座 - 秒杀系统抽象来说 ...

  2. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  3. mysql乐观锁处理超卖_通过乐观锁解决库存超卖的问题

    前言 在通过多线程来解决高并发的问题上,线程安全往往是最先需要考虑的问题,其次才是性能.库存超卖问题是有很多种技术解决方案的,比如悲观锁,分布式锁,乐观锁,队列串行化,Redis原子操作等.本篇通过M ...

  4. 教你从0到1搭建秒杀系统-防超卖

    各位读者好,最近笔者学了很多东西,其实都想跟大家进行分享,奈何需要将所学习的知识整理出来需要耗费大量的时间,包括总结,或各种图形以及写代码示例,所以可能更新的速度会比较慢.但大家放心,只要有时间我就会 ...

  5. mysql 乐观锁_使用Mysql乐观锁解决并发问题

    使用mysql乐观锁解决并发问题 案例说明 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...

  6. mysql使用条件限制乐观锁_使用Mysql乐观锁解决并发问题

    使用mysql乐观锁解决并发问题 案例说明 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...

  7. MySQL 乐观锁与悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁. 悲观锁: ...

  8. mysql乐观锁总结和实践

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些 ...

  9. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

  10. mysql乐观锁总结和实践 - 青葱岁月 - ITeye博客

    mysql乐观锁总结和实践 - 青葱岁月 - ITeye博客

最新文章

  1. js的defer属性
  2. 学习一个 Linux 命令:shutdown 命令
  3. linux环境用pycharm开发,Linux中部开发环境(Pycharm)(示例代码)
  4. FreeBSD最小化安装没有man解决方法
  5. SQL 解决从分组数据中总是挑选第一条数据的问题
  6. MySQL 高级 - 存储过程 - 语法 - case结构
  7. 数码显示实验报告C语言,数码问题C语言A星算法详细实验报告含代码(9页)-原创力文档...
  8. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心
  9. oracle查询用户权限和角色_详解jenkins配置用户角色权限的实现方法
  10. 企业域名备案流程_2021境外投资备案申报流程(办理企业境外投资证书注意事项)...
  11. 基于ssh的多节点之间互信通信的实现
  12. java的运行原理_Java的运行原理(转载)
  13. App installation failed (A valid provisioning profile for this executable was not found)
  14. Linux iptables防火墙详解(四)——配置实战
  15. android表情功能开发
  16. 双击打开excel内容不显示而显示灰色
  17. apollo自动驾驶进阶学习之:如何调试减速带通行限速参数
  18. Kafka的assign和subscribe订阅模式
  19. 2019GPLT L2-032 彩虹瓶 (25 分)
  20. 使用python开发的图形界面的pdf拆分合并工具

热门文章

  1. 反转单链表(C语言)
  2. 三个mplayer播放器mplayer mpv mplayer-ww
  3. AID Learning 0.87F3安装注意事项
  4. STM32核心板设计——电源设计
  5. WPS-Word:下一页分节符不能分页,插入下一页分节符时下一节没有在新的一页开始
  6. 10个较好在线商业理念
  7. C#学习 - XML Serialization
  8. 计算机里折叠项无法删除,删除右键多余菜单_如何去除右键菜单中多余选项?...
  9. 电子计算机off键是什么意思,off键是什么意思
  10. 论算法人的语言表达能力