PHP开发中解决并发问题的几种实现方法分析


Posted in PHP onNovember 13, 2017

本文实例讲述了PHP开发中解决并发问题的几种实现方法。分享给大家供大家参考,具体如下:

对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了

在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制。

方案一:使用文件锁排它锁

flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败

在获取到锁的时候,先查询库存,如果库存大于0,则进行下订单操作,减库存,然后释放锁

方案二:使用Mysql数据库提供的悲观锁

Innodb存储引擎支持行级锁,当某行数据被锁定时,其他进程不能对这行数据进行操作

先查询并锁定行:

select stock_num from table where id=1 for update
if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}

方案三:使用队列

将用户的下单请求依次存入一个队列中,后台用一个单独的进程处理队列中的下单请求

方案四:使用Redis

redis的操作都是原子性的,可以将商品的库存存入redis中,下单之前对库存进行decr操作,如果返回的值大于等于0等可以下单,否则不能下单,这种方式效率较高

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}

其他并发问题:

在现实应用中,很多情况下会把数据存入缓存,当缓存失效时,去数据库取数据并重新设置缓存,如果这时并发量很大,会有很多进程同时去数据库取数据,导致很多请求

穿透到数据库,而使数据库奔溃,这里可用文件锁来解决

$data = $cache->get('key');
if(!$data){
  $fp = fopen('lockfile');
  if(flock($fp, LOCK_EX)){
    $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了
    if(!$data){
      $data = mysql->query();
      $cache->set('key', $data);
    }
    flock($fp, LOCK_UN);
  }
  fclose($fp);
}

说白了,要解决并发问题就必须要加锁,各种方案的本质都是加锁

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
PHP分页类集锦
Nov 18 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
PHP生成plist数据的方法
Jun 16 PHP
php判断访问IP的方法
Jun 19 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
CI配置多数据库访问的方法
Mar 28 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Mar 09 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 #PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 #PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 #PHP
PHP 断点续传实例详解
Nov 11 #PHP
PHP+AJAX 投票器功能
Nov 11 #PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 #PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 #PHP
You might like
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python实现队列的方法
2015/05/26 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
Python如何生成树形图案
2018/01/03 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
python中if及if-else如何使用
2020/06/02 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
校园安全教育广播稿
2014/02/17 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书