在实际的开发过程中我们遇到过各种各样的活动,但像用户流量较大的平台就需要考虑高并发的问题,但是如何去解决呢?我总结了几种解决方案,欢迎大家指正!

一、什么是PV/UV/QPS?

PV:页面访问量,即PageView,用户每次对网站的访问均被记录,用户对同一页面的多次访问,访问量累计。(说白了就是用户的点击次数)
UV:独立访问用户数:即UniqueVisitor,访问网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。(说白了就是每天访问的用户数)
QPS: (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求)

二、php层面如何优化高并发?
1.redis层面:
(1)利用redis加锁机制处理setnx key value:将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是SET if Not eXists的简写。


<?phpclass Lock
{private static $_instance ;private   $_redis;private function __construct(){$this->_redis =  new Redis();$this->_redis ->connect('127.0.0.1');}public static function getInstance(){if(self::$_instance instanceof self){return self::$_instance;}return self::$_instance = new  self();}/*** @function 加锁* @param $key 锁名称* @param $expTime 过期时间*/public function set($key,$expTime){//初步加锁$isLock = $this->_redis->setnx($key,time()+$expTime);if($isLock){return true;}else{//加锁失败的情况下。判断锁是否已经存在,如果锁存在且已经过期,那么删除锁。进行重新加锁$val = $this->_redis->get($key);if($val&&$val<time()){$this->del($key);}return  $this->_redis->setnx($key,time()+$expTime);}}/*** @param $key 解锁*/public function del($key){$this->_redis->del($key);}
}$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
$lockObj = Lock::getInstance();  //单例模式
//判断是能加锁成功
if($lock = $lockObj->set('storage',10))
{$sql="select `number` from  storage where id=1 limit 1";$res = $pdo->query($sql)->fetch();$number = $res['number'];if($number>0){$sql ="insert into `order`  VALUES (null,$number)";$order_id = $pdo->query($sql);if($order_id){$sql="update storage set `number`=`number`-1 WHERE id=1";$pdo->query($sql);}}//解锁$lockObj->del('storage');}
else
{//加锁不成功执行其他操作。
}
?>  

(2)利用reids消息队列处理高并发:队列是按先进先出的顺序来执行,需要用到 lpop、rpush、llen等方法

/**
*优惠券redis入库
**/
public function reload_quan(){$yhq_dom = Yhq_user_relation::i();$redis = Redis::i('redis');$redis->setOption( \Redis::OPT_SERIALIZER, \Redis::SERIALIZER_NONE );for ($i=0;$i<100;$i++){$date_time = date('Y-m-d H:i:s',time());$res = $yhq_dom->add(['hd_id' => 3,'yhq_id'=> 19,'name'  => '满58减20','create_time' => $date_time,'price' => 58,'yuanbao' => 20]);if (!$res){$this->_error('添加第'.$i.'张优惠券时失败');}//在redis中存入数据$redis->rPush('yhq_relation',"{$i}");}$redis->expire('yhq_relation',1860);$this->_success('','库内添加优惠券成功');}
/**
*领取优惠券
**/
public function get_quan(){$redis = Redis::i('redis');$redis->setOption( \Redis::OPT_SERIALIZER, \Redis::SERIALIZER_NONE );$start_time = date('Y-m-d 00:00:00',time());$stop_time = date('Y-m-d 23:59:59',time());//判断是否在抢购时间内//$start_string = mktime(12,0,0,date('m'),date('d')-date('w')+5,date('Y'));//$stop_string = mktime(23,59,59,date('m'),date('d')-date('w')+5,date('Y'));//$now_time = time();//if ($now_time<$start_string || $now_time>$stop_string){//    $this->_error('抢券时间未到,请稍后再来~');//}$len = $redis->lLen('yhq_relation');if ($len<1){$this->_error('优惠券已经抢光啦~');}else{//领取优惠券时判断用户是否真正领取$user_id = $this->_user_info()['accid'];$yhq_dom = Yhq_user_relation::i();$where = ['accid' => $user_id,'hd_id'  => 3,'yhq_id'=>19,'create_time' => ['between' => [$start_time,$stop_time]]];$result = $yhq_dom->where($where)->find();if($result){$this->_error('对不起,您已经领取过了哦~');}else{//用户领取优惠券$expire_time = date('Y-m-d H:i:s',(time()+259200));$sql = "select id from yhq_user_relation where hd_id = 3 and yhq_id=19 and create_time between '$start_time' and '$stop_time' and accid is NULL ORDER by create_time ASC ";$update_id = $yhq_dom->query($sql)[0]['id'];//双重判断是否已经领取完毕if (!$update_id){$this->_error('优惠券已经抢光了哦~');}$redis->lPop('yhq_relation');$res = $yhq_dom->update("id={$update_id}",['accid'=>$user_id,'expire_time'=>$expire_time]);if ($res){$this->_success('','领取成功');}else{$this->_error('领取失败,请查看网络连接');}}}
}

2.数据库层面(暂时没有总结好)

[php]如何做到高并发优化相关推荐

  1. 每秒上千订单场景下的分布式锁高并发优化实践!

    本文授权转自石杉的架构笔记 背景引入 首先,我们一起来看看这个问题的背景? 前段时间有个朋友在外面面试,然后有一天找我聊说:有一个国内不错的电商公司,面试官给他出了一个场景题: 假如下单时,用分布式锁 ...

  2. Java架构-每秒上千订单场景下的分布式锁高并发优化实践!

    "上一篇文章我们聊了聊Redisson这个开源框架对Redis分布式锁的实现原理,如果有不了解的兄弟可以看一下:<拜托,面试请不要再问我Redis分布式锁实现原理>. 今天就给大 ...

  3. 网易高并发优化 | 公开课-02

    网易严选中的高并发优化 (一)单机系统缓存优化 1.背景导入 在单机情况下,CSD模型如果出现慢查询一般会把问题归结到数据库 CSD模型: 实际操作发现:当有2KW级别数据层查询是,统计总行数约1s, ...

  4. 抽奖活动的高可用、高并发优化

    这几年工作中做过不少营销活动,这里以抽奖活动为例,讨论一下如何设计出一个高可用.高并发的营销系统. 高可用.高并发架构的核心是分流和限流.系统架构时,应根据每一种营销活动的场景与特性,制定不同的分流. ...

  5. Seckill系统高并发优化

    绝大多数秒杀系统都需要实现高并发,这样就必须在原来的项目基础上进行优化.简单的优化很有可能就会很大地提高系统的并发性能,但是这些优化往往是系统开发人员很少注意的,或者直接被人们忽略.因此要成为一个出色 ...

  6. Java高并发秒杀API(四)之高并发优化

    Java高并发秒杀API(四)之高并发优化 1. 高并发优化分析 关于并发 并发性上不去是因为当多个线程同时访问一行数据时,产生了事务,因此产生写锁,每当一个获取了事务的线程把锁释放,另一个排队线程才 ...

  7. MySQL的性能优化及自动化运维实践与Mysql高并发优化

    首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 DBA 的功能. 了解这些功能以后要对体系结构有更加深入的了解,你不知道怎 ...

  8. 用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景?

    用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景? 转载 codeing_doc 最后发布于2018-11-23 09:44:41 阅读数 1073 ...

  9. MySQL MyISAM/InnoDB高并发优化经验

    最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 ...

最新文章

  1. 溃不成军:科通芯城一度再跌近30% 股价三天腰斩
  2. asp.net 上传大文件解决方案(转)
  3. ogre绘制3d图形_R语言统计与绘图:绘制饼图
  4. Linux基础知识(1)
  5. ImportError: No module named 'keras.utils.visualize_util'
  6. python 连通域_连通域的原理与Python实现
  7. shiro(一)简介、理论知识
  8. 我的应用我做主丨动手搭建招聘小应用
  9. 路由器性能测试工具_小米路由器AX3600与AX1800 MESH 实测
  10. 自创数据集,使用TensorFlow预测股票入门(转)
  11. win11如何进行bug反馈 windows11进行bug反馈的步骤方法
  12. 【排序算法】插入排序-常规方法
  13. 关于C# winform开发时datagridview图片显示异常的处理
  14. 支持语言locale
  15. 推荐6本Java书籍,助你在Java路上更精进!
  16. 2.4 旋转曲面 (2)
  17. vue即时通讯,一个很好用的插件
  18. txt文本文件数据转ArcGIS中的tif文件
  19. [XSY] 线图(树形DP、分类讨论)
  20. JavaPoet开源项目的使用

热门文章

  1. 通过PXE网络安装ESXI6
  2. SGI STL 内存分配方式及malloc底层实现分析
  3. JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)
  4. 《转》推荐系统经典论文文献及业界应用
  5. Sublime Text 3 遇到的一些小坑的解决方法
  6. SylixOS内核打印调试方法
  7. CentOS7系统启动、排错、修复、破解root口令
  8. rancher中级(二)(rancher中添加证书及操作虚拟主机)
  9. 第一课:数据结构的基本概念和术语
  10. forward和redirect的区别