一、加排它锁

$pdo=new PDO("mysql:dbname=demo;host=localhost","root","root");

$pdo->query('SET NAMES utf8');

$redis=new Redis();

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

$num=$redis->get("num");

if($num<=12)//假定库存只有12个

{

sleep(2);

$sql = "select * from goods where id=1 for update";

$stmt = $pdo->query($sql);

$res=$stmt->fetch(2);

if($res['num'])

{ $redis->incr('num');

$stmt = $pdo->exec("update goods set num=num-1 where id=1");

//自行写各种业务处理。。。

}

}

else{

echo "抢购结束";

}

二、php+redis乐观锁

$pdo=new PDO("mysql:dbname=demo;host=localhost","root","root");

$pdo->query('SET NAMES utf8');

$redis=new Redis();

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

$uid=md5(mt_rand(1,1000000));//模拟生成用户id

var_dump($redis->lrange('user',0,-1));

$num=$redis->get("num");

// $redis->del("num");

// $redis->del("user");

//die;

if($num>=3) exit("抢购结束");//假设只有3个库存量

$redis->watch('num');//监听key的变化,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

//开始事务

$redis->multi();

$redis->incr('num');

sleep(2);

$result=$redis->exec(); //返回true表示执行成功,nil表示事务被中断

if($result)

{

$stmt = $pdo->exec("update goods set num=num-1 where id=1");

if($stmt){

echo "抢购成功";

$redis->lpush("user",$uid);//记录抢购成功的用户id

//自行写各种业务处理。。。

}

}

经过ab压测后,就再也不会出现超卖的情况啦,哈哈

三、最后一个用文件锁,性能也是最低的,不推荐使用

$redis=new Redis();

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

$num=$redis->get('num');//购买数量

$ku=1;//库存量

if($num

$file=fopen('1.lock',"a");

if(flock($file,LOCK_EX))

{

$store=$redis->incr('num');

fwrite($file,$store);

sleep(5);

//自行写各种业务处理。。。

flock($file,LOCK_UN);

}

fclose($file);

}

php 锁机制 stream,Php+redis+锁机制实现高并发秒杀抢购解决方案相关推荐

  1. SpringBoot、Redis轻松实现Java高并发秒杀系统笔记

    秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...

  2. Redis之实现优惠券高并发秒杀下单

    Redis之实现优惠券高并发秒杀下单 实现逻辑如图: 此方法高并发情况下会出现超库存的问题,可使用乐观锁解决,乐观锁使用场景是更新的时候 一:解决乐观锁方法一:加版本号,如图所示: 二:使用CAS法解 ...

  3. gin redis 链接不上_Redis 高并发问题,及解决方案!

    (一)redis技术的使用: redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动... redis之所以能解决高并发的原因是它可以直接访问内存,而以 ...

  4. Java高并发秒杀平台(Redis + RabbitMQ)

    Seconds-Kill 本项目是一个模拟高并发环境下基于 SpringBoot 的秒杀购物平台.为了减少对数据库的直接访问,通过 Redis 实现了缓存优化:并通过 RabbitMQ 消息中间件来接 ...

  5. php redis下单,redis 队列简单实现高并发抢购/秒杀

    redis 队列简单实现高并发抢购/秒杀 2019-03-21 14:34 阅读数 82 前提为每人限购1件 <>开抢前 把秒杀商品库存存进 Redis 队列中 $redis = new ...

  6. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  7. Redis(十)redis使用list解决高并发问题,如商品秒杀

    redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动. redis之所以能解决高并发的原因是它可以直接访问内存,而以往我们用的是数据库(硬盘),提高了 ...

  8. 借助Redis锁,完美解决高并发秒杀问题

    欢迎关注方志朋的博客,回复"666"获面试宝典 场景:一家网上商城做商品限量秒杀. 1 单机环境下的锁 将商品的数量存到Redis中.每个用户抢购前都需要到Redis中查询商品数量 ...

  9. redis rua解决库存问题_Redis锁完美解决高并发秒杀问题

    场景:一家网上商城做商品限量秒杀. 1 单机环境下的锁 将商品的数量存到Redis中.每个用户抢购前都需要到Redis中查询商品数量(代替mysql数据库.不考虑事务),如果商品数量大于0,则证明商品 ...

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

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

最新文章

  1. 使用HTML CSS完成初步的页面,任务九:使用HTML/CSS实现一个复杂页面(示例代码)
  2. 他是阿里 P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!...
  3. 04 ffmpeg 从媒体文件解封装,输出YUV420图像
  4. 选项卡TabPanel控件
  5. PHP进行生成并且导出CSV文件
  6. python自动化办公知识点整理汇总_Python自动化办公知识点整理汇总
  7. 1185. 一周中的第几天 golang
  8. 动态创建Fastreport
  9. mvc设计模式_MVC设计模式
  10. Apache的网页优化!!给你的网页套上一层层保护罩(网页压缩、网页缓存、隐藏版本信息、设置防盗链)
  11. 使用java生成mapbox-gl可读的vector tile
  12. pinpoint全链路监控安装部署(支持dubbo)
  13. 用MATLAB分析电能质量,基于matlab仿真的电能质量研究.doc
  14. greedy、reluctant和possessive量词
  15. 银河麒麟系统部署.net core环境
  16. 练习一万小时成天才?
  17. Unity旋转之四元数(开关车门,第一人称控制器)
  18. python冷知识—程序员的快乐“\a“
  19. [宋史学习] 赵光义如何篡权
  20. SpringBoot 之 分分钟搞懂Lombok使用与原理

热门文章

  1. 如何提高Android代码的安全性
  2. 2021-10-12
  3. 七月算法机器学习4 凸优化初步
  4. 结构体做函数参数的进阶:嵌套一二级指针
  5. WinEdt Latex使用人家提供的模板时无法插入参考文献的方法
  6. Atitit 获取剪贴板内容 目录 1.1. ava提供两种类型的剪贴板:系统的和本地的. 1 1.2. Atitit 剪贴板数据类型 DataFlavor 1 1.3. Atitit 获取剪贴板内
  7. atitit 碎片化学习.docx attilax 总结
  8. Atitit 编程语言原理与概论attilax总结 三大书籍总结
  9. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener
  10. Atitit.swt 线程调用ui控件的方法