现在在电商行业里,秒杀抢购活动已是商家经常使用促销手段。可是库存数量有限,而同时下单人数超过了库存量,就会致使商品超卖甚至库存变负数的问题。

又好比:抢购火车票、论坛抢楼、抽奖乃至爆红微博评论等也会引起阻塞式高并发问题。若是不作任何措施可能在高瞬间形成服务器瘫痪,如何解决这个问题呢?

这里提出我的认为比较可行的几个思路方法:

方案一:使用消息队列来实现

能够基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧

好比有100张票可供用户抢,那么就能够把这100张票放到缓存中,读写时不要加锁。 当并发量大的时候,可能有500人左右抢票成功,这样对于500后面的请求能够直接转到活动结束的静态页面。进去的500我的中有400我的是不可能得到 商品的。因此能够根据进入队列的前后顺序只能前100我的购买成功。后面400我的就直接转到活动结束页面。固然进去500我的只是举个例子,至于多少可 以本身调整。而活动结束页面必定要用静态页面,不要用数据库。这样就减轻了数据库的压力。

方案二:当有多台服务器时,能够采用分流的形式实现

假设有m张票, 有n台产品服务器接收请求,有x个请求路由服务器随机转发

直接给每台产品服务器分配 m/n张票

每台产品服务器内存作计数器,好比容许m/n*(1+0.1)我的进来。

当内存计数器已满:

后面进的人, 直接跳到到转到活动结束的静态页面,

通知路由服务器,不在路由到这台服务器(这个值得商讨)。

全部产品服务器进来的m/n*(1+0.1)我的再所有转发到一台付款服务器上,进入付款环节,看谁手快了,这时候人少,加锁什么的就简单的。

方案3、若是是单服务器,能够使用Memcache锁来实现

product_key 为票的key

product_lock_key 为票锁key

当product_key存在于memcached中时,全部用户均可以进入下单流程。

当进入支付流程时,首先往memcached存放add(product_lock_key, “1″),

若是返回成功,进入支付流程。

若是不成,则说明已经有人进入支付流程,则线程等待N秒,递归执行add操做。

方案4、借助文件排他锁

在处理下单请求的时候,用flock锁定一个文件,若是锁定失败说明有其余订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

本文要说的是第4种方案,大体代码以下

php

方案五sql

根据update结果来判断,咱们能够在sql2的时候加一个判断条件update ... where 库存>0,若是返回false,则说明库存不足,并回滚事务。数据库

阻塞(等待)模式:

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX))

{

//..处理订单

flock($fp,LOCK_UN);

}

fclose($fp);

?>

非阻塞模式:

$fp = fopen("lock.txt", "w+");

if(flock($fp,LOCK_EX | LOCK_NB))

{

//..处理订单

flock($fp,LOCK_UN);

}

else

{

echo "系统繁忙,请稍后再试";

}

fclose($fp);

?>缓存

php秒杀防重复中奖_PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法...相关推荐

  1. php秒杀防重复中奖_PHP如何应对秒杀抢购高并发思路

    原标题:PHP如何应对秒杀抢购高并发思路 我们常用QPS(Query Per Second,每秒处理请求数)来衡量一个web应用的吞吐率,解决每秒数万次的高并发场景,这个指标非常关键. 举个栗子:假设 ...

  2. 高并发库存秒杀场景,阿里巴巴数据库是这样应对的

    简单库存场景的数据库实现 一般来说,从数据库层面讲,库存业务会分为两步,第一步是插入一条记录到扣减明细表inventory_detail,第二步是对库存扣减表inventory的一条记录进行扣减,这两 ...

  3. 分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案

    技术指标: PV(Page View, 页面浏览量)在千万级别 QPS(Query Per Second, 每秒处理请求数)在百万级别 数据量在千亿级别 接口响应速度不能超过150毫秒 用户提交请求到 ...

  4. 分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案...

    技术指标: PV(Page View, 页面浏览量)在千万级别 QPS(Query Per Second, 每秒处理请求数)在百万级别 数据量在千亿级别 接口响应速度不能超过150毫秒 用户提交请求到 ...

  5. 91免费视频Redis+Lua解决高并发场景在线秒杀问题

    为何要使用Lua脚本解决商品超卖的问题呢? Redis在2.6版本后原生支持Lua脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 将复杂的或者多步的redis操作,写为一个脚本,一次 ...

  6. PHP收费事件导致用户流失,PHP秒杀系统方案(解决大流量,高并发)

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...

  7. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统

    一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...

  8. 关于防重复提交出现 页面过期的问题

    在做包剪锤游戏时,下注的时候提交一个json 请求.不断的刷新后,点击下注,提示页面过期. 经分析研究有如下疑问: 1.页面已经产生了新的token, 点击下注按钮 ,匹配session中的token ...

  9. php 和mysql实现抢购功能_php处理抢购类功能的高并发请求

    本文以抢购.秒杀为例.介绍如何在高并发状况下确保数据正确. 在高并发请求下容易参数两个问题 1.数据出错,导致产品超卖. 2.频繁操作数据库,导致性能下降. 测试环境 Windows7 apache2 ...

最新文章

  1. 【caffe】create_cifar10.sh在windows下解决方案
  2. Mysql中表名作为参数的问题
  3. 超图桌面版制作分段专题图学习
  4. 和vs版本关系_栈局部变量优化探究,意外发现了 vs 的一个 bug ?
  5. 关于同时可用git命令clone和TortoiseGit拉取代码不需要密码
  6. 简单描述char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别
  7. 30 个惊艳的Python开源项目
  8. jQuery与JavaScript与ajax三者的区别与联系
  9. python lxml用法详解_Python-- lxml用法
  10. js三级分类菜单导航
  11. ASPxGridView数据汇总收藏
  12. h5支付回调返回值是什么 php_微信HTML5网页支付PHP + JS API总结
  13. java经典算法(一)——zws
  14. PostgreSQL数据库部署之 :PostgreSQL pgadmin4 the application server could not be contacted
  15. DGM: A deep learning algorithm for solving partial differential equations
  16. 问题 D: 天神下凡
  17. 网页ssl证书风险怎么解决
  18. 中国车用尿素市场规模调研与发展趋势分析报告2022-2028年
  19. [Go学习记录]实现正反打印九九乘法表
  20. 发送邮件使家中NAS自动下载资源

热门文章

  1. Linux ALSA驱动框架(六)--ASoC架构中的Platfrom
  2. 二十九、重磅:近1GB的三千万聊天语料供出
  3. 如何显示文件后缀名(来源 百度)
  4. [CCD] CCD感光模块的尺寸是怎么算的?
  5. mysql 双主 脑裂_MySQL高可用方案——双主
  6. 年末系列(2)-加速器
  7. 利用osp.join()拼接文件名,利用f“{}“强制类型转换,利用osp.basename得到路径后面的文件名
  8. 联想搜索实现方案(java基于字典树算法的实现方式)
  9. echarts 折线图 设置y轴最小刻度_用plotly和plt画图的基本设置(标题、坐标轴、图例、注释、图像)...
  10. [Android]自定义绘制一个简易的音频条形图,附上对MP3音频波形数据的采集与展现