2016-07-13 18:32:46 qq_26291823 阅读数 7151
  • 阿里沈询:高并发网站中的数据库设计视频教程

    高并发网站中的数据库设计视频教程,该课程主要分为3个部分,1、数据库的基本组成:KV存储系统、查询优化原理、单机/多机事务概述;2、分布式存储、Key-Value的多机扩展、CAP和分布式系统的一致性;3、阿里数据库的一些最佳实践。 嘉宾介绍:王晶昱(花名:沈询),阿里巴巴技术讲师 。目前主要负责阿里的分布式数据库DRDS(TDDL)和阿里的分布式消息服务ONS(RocketMQ/Notify)两个系统。

    12084 人正在学习 去看看 CSDN讲师

php网站大数据高并发处理方法简单总结

一层层剥开来讲,有以下部位需要注意。

1.资源。能静态实现的就静态实现,静态资源也要尽量使用分布式存储,例如云存储。

2.效率。PHP代码里,尽量注意内存的使用,单个脚本的运行效率要Ok.

3.缓存。使用memcache来实现非持久存储,使用no-sql来实现持久存储。

4.server。使用nginx+fpm或者nginx+apache,来实现动静态分离访问。

5.mysql。作为最终的存储库以及一些不可避免的实时调用库,做主从处理,Master+多Slave,多个只读副本来实现实时的调用库。

6.负载。建议架设一层负载均衡,来实现web server的轮询。例如云平台中的LBS。

2018-09-02 10:55:32 M__L__ 阅读数 461
  • 阿里沈询:高并发网站中的数据库设计视频教程

    高并发网站中的数据库设计视频教程,该课程主要分为3个部分,1、数据库的基本组成:KV存储系统、查询优化原理、单机/多机事务概述;2、分布式存储、Key-Value的多机扩展、CAP和分布式系统的一致性;3、阿里数据库的一些最佳实践。 嘉宾介绍:王晶昱(花名:沈询),阿里巴巴技术讲师 。目前主要负责阿里的分布式数据库DRDS(TDDL)和阿里的分布式消息服务ONS(RocketMQ/Notify)两个系统。

    12084 人正在学习 去看看 CSDN讲师

PHP高并发处理

  • 首先,确定服务器硬件是否足够支撑当前的流量。影响因素:带宽,硬盘读写速度,内存大小,cpu处理速度等。
  • 数据库优化
  • 使用缓存,如redis,memcached等。
  • 主从复制或主主复制,读写分离。
  • 队列处理
  • nginx反向代理实现负载均衡。
  • 使用锁机制,如文件锁排它锁,乐观锁,悲观锁
  • 结合mysql事务来使用。
2017-08-19 22:25:26 u011061889 阅读数 4078
  • 阿里沈询:高并发网站中的数据库设计视频教程

    高并发网站中的数据库设计视频教程,该课程主要分为3个部分,1、数据库的基本组成:KV存储系统、查询优化原理、单机/多机事务概述;2、分布式存储、Key-Value的多机扩展、CAP和分布式系统的一致性;3、阿里数据库的一些最佳实践。 嘉宾介绍:王晶昱(花名:沈询),阿里巴巴技术讲师 。目前主要负责阿里的分布式数据库DRDS(TDDL)和阿里的分布式消息服务ONS(RocketMQ/Notify)两个系统。

    12084 人正在学习 去看看 CSDN讲师

本文以抢购、秒杀为例。介绍如何在高并发状况下确保数据正确。
在高并发请求下容易参数两个问题
1.数据出错,导致产品超卖。
2.频繁操作数据库,导致性能下降。

测试环境

Windows7
apache2.4.9
php5.5.12
php框架 yii2.0
工具 apache bench (apache自带高并发请求工具)。

通常处理方法

从控制器可以看出代码思路。先查询商品库存。如果库存大于0
,则库存减少1,同时生产订单,录入抢购者数据。

    // 常规代码处理高并发
    public function actionNormal(){
        // 查询库存
        $stock = Goods::find()->select('stock')->where(['goods_id'=>100001])->asArray()->one();
        // 判断该商品是否还有库存
        if ($stock['stock']>0) {
            // 库存减一
            Goods::updateAllCounters(['stock' => -1],['goods_id'=>100001]);

            // 生产订单(另外功能,暂且随机赋值)
            $order = $this->build_order();

            // 秒杀信息入库
            $model = new Highly();
            $model->order_id = $order;
            $model->goods_name = '秒杀商品';
            $model->buy_time = date('Y-m-d H:i:s',time());
            $model->mircrotime = microtime(true);
            if($model->save()===false){
                echo '未能成功抢购!';
            }else{
                echo '恭喜你,订单<b>'.$order.'</b>抢购成功';
            }

        }else{
            echo '已被抢购一空!';
        }
    }

将商品库存设置为20后,通过ab 配置200的并发请求。

ab -n 200 -c 200 http//localhost/highly/normal

执行结果发现库存变成了负值,商品超卖了。
这里写图片描述
原因比较简单,在高并发请求下。在生产订单,减少库存之前,会优先查询到库存结果。

优化一:修改库存数据类型

第一种优化方法,从数据库入手。既然查询到的结果不准确,那我就在库存减少上做手脚。将库存的数据类型改成无符号(不能有负值)。
代码还是跟上面差不多,只是在库存减1的地方做了个判断。避免报错。

public function actionNormal(){
        // 查询库存
        $stock = Goods::find()->select('stock')->where(['goods_id'=>100001])->asArray()->one();
        // 判断该商品是否还有库存
        if ($stock['stock']>0) {
            // 库存减一
            if(Goods::updateAllCounters(['stock' => -1],['goods_id'=>100001])===false){
                echo "已被抢购一空!";
                return false;
            }

            // 生产订单(另外功能,暂且随机赋值)
            $order = $this->build_order();

            // 秒杀信息入库
            $model = new Highly();
            $model->order_id = $order;
            $model->goods_name = '秒杀商品';
            $model->buy_time = date('Y-m-d H:i:s',time());
            $model->mircrotime = microtime(true);
            if($model->save()===false){
                echo '未能成功抢购!';
            }else{
                echo '恭喜你,订单<b>'.$order.'</b>抢购成功';
            }

        }else{
            echo '已被抢购一空!';
        }
    }

这一次同样200的并发,执行结果发现。数据正确,并不会出现超卖的情况。
思路其实也比较简单。因为库存不能为负值,当库存等于0时,如果还有值传进来,则会报错。请求被终止。

这种优化方式,虽然避免了商品超卖的情况。但是在另一方面,请求仍然会对数据库造成压力。如果多个功能使用此数据库,会造成性能下降厉害。

优化二:redis

利用 redis list类型的pop的原子性。在操作数据库前,做一个验证。当商品卖完后,就不允许再继续进行数据库操作。

// redis list 高并发测试
    public function actionRedis(){
        $redis = \Yii::$app->redis;
        // $redis->lpush('mytest',1);
        $order = $this->build_order();
        // echo $order;die;
        // echo $redis->llen('mytest');
        $reg = $redis->lpop('mytest');
        if (!$reg) {
            echo "笨蛋!已经被抢光啦!";
            return false;
        }
        $redis->close();
        $model = new Highly();
        $model->order_id = $order;
        $model->goods_name = '秒杀商品';
        $model->buy_time = date('Y-m-d H:i:s',time());
        $model->mircrotime = microtime(true);

        if($model->save()===false){
            echo '未能成功抢购!';
        }else{
            echo '恭喜你,订单<b>'.$order.'</b>抢购成功';
        }
    }
    // 给redis添加商品
    public function actionInsertgoods(){
        $count = yii::$app->request->get('count',0);
        if (empty($count)) {
            echo '大兄弟,你还没告诉我需要上架多少商品呢!';
            return false;
        }
        $redis = \Yii::$app->redis;
        for ($i=0; $i < $count; $i++) { 
            $redis->lpush('mytest',1);
        }
        echo '成功添加了'.$redis->llen('mytest').'件商品。';
        $redis->close();

    }

这点的代码,我写了两个方法。第一个方法是秒杀的代码,第二个方法是给秒杀的商品设置数量。为了方便测试,我这里处理的比较简单。

通过测试,数据库生产的订单数量正常,并没有出现问题。而又避免了请求数据库造成性能下降的问题。同时内存数据库redis查询的速度要比mysql快很多。

2018-04-10 15:53:45 u012835679 阅读数 250
  • 阿里沈询:高并发网站中的数据库设计视频教程

    高并发网站中的数据库设计视频教程,该课程主要分为3个部分,1、数据库的基本组成:KV存储系统、查询优化原理、单机/多机事务概述;2、分布式存储、Key-Value的多机扩展、CAP和分布式系统的一致性;3、阿里数据库的一些最佳实践。 嘉宾介绍:王晶昱(花名:沈询),阿里巴巴技术讲师 。目前主要负责阿里的分布式数据库DRDS(TDDL)和阿里的分布式消息服务ONS(RocketMQ/Notify)两个系统。

    12084 人正在学习 去看看 CSDN讲师
场景:很难做静态化,像做一个微博那样的东西,并发又高,跟新又快,这种需求的话,又该怎么处理?
高并发的问题点是:高并发更多的是考验数据的读写,最终考验的是根据具体的业务需求惊醒系统的架构;
解决方案:1.分清楚哪些数据是实时读写,哪些数据是异步读写;(区分数据实时还是异步的方法:)
2.数据的存储方案;mysql擅长的是关系数据和数据统计,高并发访问时瓶颈;
memcache擅长的是数据缓存,但是kv的数据结构有限;
redis作为内存数据库但是内存空间毕竟没有硬盘空间大;
(各有优缺点,根据自己的业务来综合或者选取这些工具,在做横向和纵向的分库分表,再辅以memcache集群缓存
key-value高性能存储,异步队列任务系统,整个架构就可以建立起来)
3.静态动态访问:动态网站静态化 http://blog.csdn.net/wenniuwuren/article/details/50507580
使用cdn,或者至少弄个静态访问层,至于使用apache还是nginx或者其它的,自己在虚拟机上都安装一遍,做一个
压力测试对比一下,非静态访问转发到动态访问层。
4.php的逻辑处理:php承接动态访问的输入,进行逻辑运算,最后到数据层去进行读写,比较坑的事就是,无谓的
foreach循环,复制等操作;
5.做静态化,减少数据库的压力,能静态化的静态化,不能静态化的用分布式算法,不要将运算交给数据库;
常识扩展:1.php网站的瓶颈基本在数据库和存储系统,数据的一致性,可扩展性,可用性很难保证。(需要根据具体的业务场景做横向
和纵向的分库分表);
2.一般使用LVS+PHP(1000台),就算日均80亿次请求,每秒有10万并发,那分到每台机器的请求只有100个。只要你的php程序不是
太差,100QPS是没问题的;
3.有一类真正的高并发,比如WebIM,一台机器要承载数十万的TCP客户端连接,进行大规模的实时通信。可以用PHP的
异步高并发扩展swoole.链接:Swoole: PHP的异步、并行、分布式扩展框架 http://www.swoole.com/ 链接:Swoole: PHP的异步、并行、分布式扩展框架

2018-03-11 21:27:24 sinat_34828933 阅读数 987
  • 阿里沈询:高并发网站中的数据库设计视频教程

    高并发网站中的数据库设计视频教程,该课程主要分为3个部分,1、数据库的基本组成:KV存储系统、查询优化原理、单机/多机事务概述;2、分布式存储、Key-Value的多机扩展、CAP和分布式系统的一致性;3、阿里数据库的一些最佳实践。 嘉宾介绍:王晶昱(花名:沈询),阿里巴巴技术讲师 。目前主要负责阿里的分布式数据库DRDS(TDDL)和阿里的分布式消息服务ONS(RocketMQ/Notify)两个系统。

    12084 人正在学习 去看看 CSDN讲师

下面为大家梳理一下高并发处理的思路,从几个方面进行解决

1、流量处理

  • 防盗链处理(可以在nginx.conf配置,做加密处理,或者请求域名限制)

2、前端优化

  • 减少HTTP请求,减少css,js,image等组件的请求数(例如设置地图图片请求)
  • 添加异步请求(ajax的异步请求等)
  • 启用浏览器缓存和文件压缩
  • CDN加速(cdn的工作原理要明确,可以选用LVS做4层负载均衡,nginx或者squid做反向代理)
  • 建立独立的图片服务器

3、服务端优化

  • 页面静态化
  • 并发处理
  • 队列处理

4、数据库优化

  • 数据库缓存(redis)
  • 分库分表,分区操作
  • 读写分离
  • 主从复制
  • 双主热备
  • 负载均衡

5、web服务器优化

  • nginx负载均衡
  • F5(价格高昂)
  • LVS负载均衡

 

高并发处理方案

阅读数 26

没有更多推荐了,返回首页