商品秒杀,防并发解决思路

news/2024/7/2 23:07:38

我们在做电商项目的时候,经常会遇到抢购秒杀的问题,综合来说主要是两个问题

一,高并发情况下对数据库产生的压力

二,如何避免超卖(库存< 0)的情况。

针对这两个问题来谈下解决思路

一,缓解数据库压力 用 缓存就可以解决 例如redis,memecache 等 就不在多说了。

二,解决这个问题有几种思路(推荐4redis)

1、将库存 goods_store 设置为 unsigned 则当小于0的时候则update失败

sql = update goods set goods_store=goods_store-1 where goods_store>0 and goods_id=11111

2、利用flock 文件排它锁

$fp = fopen('flock.txt', 'w+');

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

     echo '系统繁忙稍后再试';

    die;

}

下单.....

减库存......

3、使用数据库悲观锁(数据库开销比较大)

mysql_query('BEGIN');

$sql = 'select goods_store from goods where goods_id=11111 for update';

$res = mysql_query($sql, $conn);

$row = mysql_fetch_assoc($res,);

if ($row['goods_store'] > 0){

$sql2 = 'update goods set good_store=goods_store-1 where goods_id=11111';

        ........

}

4、使用redis队列,因为pop操作是原子性的,即使很多用户到达也会依次执行,推荐使用(数据库悲观锁和flock在高并发情况下性能会下降很多)

①将库存存入redis

$amount = 100;

$redis = new Redis();

$res = $redis->connect('127.0.0.1', 6379);

$result = $redis->llen('goods_expensive');//查询已经消费掉的库存

$count = $amount - $result;//剩余库存

for($i=0; $i < $count; $i++){

    $redis->lpush('goods_store',1);//遍历存入list

}

echo $redis->llen('goods_store');

②在下单前先判断库存量

$count=$redis->lpop('good_store');

if(!$count){

    die('没有库存了');

}

$sql = update goods set goods_store=goods_store-1 where goods_id=11111;

库存减少成功.....

转载于:https://www.cnblogs.com/ngx171/p/8579249.html


http://lihuaxi.xjx100.cn/news/237326.html

相关文章

在CentOS7上部署Apache Mesos

概述 Apache Mesos是一款基于多资源&#xff08;内存、磁盘、CPU、端口等&#xff09;调度的开源集群管理套件&#xff0c;能使容错和分布式系统更加容易。 工作原理 Apache Mesos采用了Master/Slave结构来简化设计&#xff0c;将Master做得尽可能轻量级&#xff0c;仅保存了各…

EOS是什么

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS是什么 EOS&#xff1a;EOS可以理解为Enterprise Operation System&#xff0c;即为商用分布式应用设计的一款区块链操作系统。EOS是EOS软件引入…

java学习路线图(2018年最新版)

最近有些网友问我如何自学 Java 后端&#xff0c;还有些是想从别的方向想转过来&#xff0c;但都不太了解 Java 后端究竟需要学什么&#xff0c;究竟要从哪里学起&#xff0c;哪些是主流的 Java 后端技术等等&#xff0c;导致想学&#xff0c;但又很迷茫&#xff0c;不知从何下…

基于GTID模式MySQL主从复制

基于GTID模式MySQL主从复制 GTID复制原理&#xff1a;基于GTID的复制是MySQL 5.6后新增的复制方式GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交的事务在集群中有一个唯一的ID.在原来基于日志的复制中, 从库需要告知主库要从哪个偏移量positio…

alpine 交互sh_在这个免费的交互式教程中学习Alpine JS

alpine 交互shAlpine.js is a rugged, minimal framework for composing Javascript behavior in your markup. Thats right, in your markup! Alpine.js是一个坚固的最小框架&#xff0c;用于在标记中构成Javascript行为。 是的&#xff0c;在您的标记中&#xff01; It allo…

非对称加密中公钥

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 数字签名是公钥密码体系中签名验证功能的一个应用。其目的是保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。其中数字签名是个加密…

Intellij IDEA 将工程转换成maven工程 详解

1> 右键工程&#xff0c;点击 Add Framework Support2> 选中 Maven&#xff0c;再点击 OK3> 工程根目录自动生成 pom.xml 文件&#xff0c;这样 工程就支持 Maven版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 http://blog.csdn.net/che…

保持分布式团队同步

分布式团队最大的挑战是沟通&#xff0c;这对建立协作的基本原则必不可少。调整工作时间&#xff0c;互相适应&#xff0c;而团队联络员有助于沟通和同步工作。以信任、尊重和开明为基础的团队会鼓励组织中的人们互相帮助&#xff0c;培养一种使团队保持同步的文化。\\SkuVault…