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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
自己前几天写的无限分类类
Feb 14 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 PHP
PHP中的integer类型使用分析
Jul 27 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
php重定向的三种方法分享
Feb 22 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
PHP 生成微信红包代码简单
Mar 25 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 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
一个用php3编写的简单计数器
2006/10/09 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP7新增函数
2021/03/09 PHP
js CSS操作方法集合
2008/10/31 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python的高阶函数用法实例分析
2019/04/11 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python configparser模块常用方法解析
2020/05/22 Python
Python中格式化字符串的四种实现
2020/05/26 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
应聘自荐书
2013/10/08 职场文书
2014年三万活动总结
2014/04/26 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
应届大学生求职信
2014/07/20 职场文书
市场营销工作计划书
2014/09/15 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
横店影视城导游词
2015/02/06 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript