登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 304|回复: 0

PHP开辟中办理并发题目的几种实现方法分析

[复制链接]

12

主题

0

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2017-12-6 09:54:59 | 显示全部楼层 |阅读模式 来自 美国
您的域名(hlsh.sh)未得到授权,部门功能受到影响!


尊重的用户:

  您好!非常感谢您能安装和关注本产物,为了产物的可连续发展和升级,众大云收罗已经开始收费。

  向用户收费是为了给用户更可靠的保障和服务,所收取的费用重要用于产物的正常运作、研发和改进,盼望各位可以或许明白和支持。

  别的,为了报答新老客户,众大云收罗3折优惠,原价980元,如今购买仅需290元,给您节流了690元。

  官方QQ群:23530791  客服QQ:155120699

  购买域名授权请打开下面的网址:

http://www.0762home.com/zt/csdn123_news/pay_url.php?url=hlsh.sh

  购买域名授权之后全部的未授权提示将主动消散,图片也正常表现,域名授权永世有用终身可用,后续的升级更新也是免费的,一次购买一辈子都能用,无后顾之忧!

提示:您现在利用的是免费试用版,可以手动删除上面的授权提示,发布这篇文章!


Uopm7P3U1UuaohEk.jpg

文章来自:博客

http://baijiahao.baidu.com/s?id=1572893240937048&wfr=spider&for=pc

 



付出宝红包分享

小同伴们,给各人发红包喽!大家可领,领完就能用。祝各人领取的红包金额大大大!#吱口令#长按复制此消息,打开付出宝就能领取!SJIJ3r58z8 umpv5DzpmOpBDm2o.jpg


本文实例报告了PHP开辟中办理并发题目的几种实现方法。分享给各人供各人参考,详细如下:
对于商品抢购等并发场景下,大概会出现超卖的征象,这时就必要办理并发所带来的这些题目了
在PHP语言中并没有原生的提供并发的办理方案,因此就必要借助其他方式来实现并发控制。
方案一:利用文件锁排它锁
flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,别的没有获取到锁的线程要么壅闭,要么获取失败
在获取到锁的时间,先查询库存,假如库存大于0,则举行下订单操纵,减库存,然后开释锁
方案二:利用Mysql数据库提供的灰心锁
Innodb存储引擎支持行级锁,当某行数据被锁定时,其他历程不能对这行数据举行操纵
先查询并锁定行:
1
2
3
4
5
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等可以下单,否则不能下单,这种方式服从较高
1
2
3
4
5
6
7
8
9
10
if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不敷
 }
}else{
//库存不敷
}

其他并发题目:
在实际应用中,许多环境下会把数据存入缓存,当缓存失效时,去数据库取数据并重新设置缓存,假如这时并发量很大,会有许多历程同时去数据库取数据,导致许多哀求
穿透到数据库,而使数据库奔溃,这里可用文件锁来办理
1
2
3
4
5
6
7
8
9
0
1
2
3
$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);
}


说白了,要办理并发题目就必须要加锁,各种方案的本质都是加锁
xoeGog11E5OA0Yab.jpg




上一篇:PHP实现网站访问量计数器
下一篇:php+Laravel 实现摆设主动化
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-15 07:49 , Processed in 0.056909 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表