第一版产品采用的是Jquery,Nginx,PHP(CI框架),Memcache,Mysql这种常用的架构。作为一名PHP工程师对于这种架构已经非常的熟悉了,目前站点并发并不是很高,线上环境使用的是阿里云主机,1.5G的内存,PHP并发能支持400~500左右。因为使用memcache的原因,如果在并发特别高的情况下,除了带宽瓶颈以外就可能会是一直引以为傲PHP瓶颈了。增加机器便会增加成本,对于一个刚刚上线运行的项目,要求公司扩大投入是不合理的。
     于是在第二次改版的过程中我们尝试放弃PHP,采用OpenResty中的LuaJit模块直接读取redis中的数据以Json的格式返回给前端页面展示,使用PHP脚本定时执行向redis里面更新内容。这样整合个前端过程就没啥php与mysql哈事了(除后端定时执行脚本之外)。凭着nginx与redis的高并发,还怕啥呀!。下图为新的架构主要结构。

Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcache这类key-value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
性能测试结果:SET操作每秒钟110000 次,GET操作每秒钟81000 次

有了Redis作为保障,新架构就可以开搞了,使用到的主要关键词由openResty,LuaJit,Lua,Redis,PHP,PHPRedis,JSon,JQuery等组成。读者可以搜索下各名词了解它们的功能。下面是openResty中的Nginx配置:

nginx.conf
server {
        listen   80;

root/home/boolean/Htdocs/lib.bincent.com;
        index index.htmlindex.htm;
        server_namelib.bincent.cn;

#默认请求Html转发到apache,这里你可以根据自己情况配置
        location /
        {
                proxy_redirect off; 
                proxy_set_header HOST$host;  
                proxy_set_headerSERVER_ADDR $server_addr;  
                proxy_set_headerSERVER_PORT $server_port;  
                proxy_set_headerREMOTE_ADDR $remote_addr;  
                proxy_set_headerREMOTE_PORT $remote_port;  
                proxy_pass  http://lib.bincent.cn:8080;
        }

#更新redis
        location /set_redis
        {
            internal;
            set_unescape_uri$key $arg_key;
                set_unescape_uri$val $arg_val;
                redis2_queryset $key $val;
            redis2_pass127.0.0.1:6379;
        }

#读取redis
        location /get_redis
        {
            internal;
            set_unescape_uri$key $arg_key;
            redis2_queryget $key;
            redis2_pass127.0.0.1:6379;
        }

# 模拟的简单请求
        location /json
        {
            default_typetext/html;
                 content_by_lua_file/home/boolean/Htdocs/lib.bincent.com/lua/redis.lua;
        }

}

redis.lua文件
#通过URL更新redis

functionsetRedis(key, val)
    localres = ngx.location.capture('/set_redis', {
                args= {
                     key= key,
                     val= val
                    }
                })
    ifres.status == 200 then
        returntrue
    else
        returnfalse
    end
end
#通过URL读取redis
functiongetRedis(key)
    localcapture = ngx.location.capture('/get_redis', {
                args= {
                    key= key
                    }
                })
    localparser = require 'redis.parser' --require redis.parser
    localres, err = parser.parse_reply(capture.body)
   
    returnres
end
#URL参数$_GET['a']
locala = ngx.var.arg_a
if'clean' == a then
    --重置redis
    ifsetRedis('love_number', 0) then
        ngx.say("CleanRedis Is Success!")
    else
        ngx.say("CleanRedis Is failted!")
    end
else
    --读取redis
    locallove_number = getRedis('love_number') + 1
    setRedis('love_number',love_number)
    ngx.say("CurrentLove Number Is: ", love_number)
end
 
 

Nginx与Redis解决高并发问题的更多相关文章

  1. nginx+lua+redis构建高并发应用(转)

    nginx+lua+redis构建高并发应用 ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求. url请求nginx服务器,然后lua查询redis, ...

  2. Nginx和Tengine解决高并发和高可用,而非推荐Apache

    什么是Nginx  什么是Tengine 看看国内大公司在用Nginx和Tengine吗? 步骤一:进入 https://www.taobao.com/,按F12.可看到 有很多APP对淘宝进行请求. ...

  3. Lua + Redis 解决高并发

    一.业务背景 优惠券业务主要提供用户领券和消券的功能:领取优惠券的动作由用户直接发起,由于资源有限,我们必须对用户的领取动作进行一些常规约束. 约束1(优惠券维度): 券的最大数量 max: 约束2( ...

  4. Nginx+Lua+Redis构建高并发应用

    一.  源文来自:http://www.ttlsa.com/nginx/nginx-lua-redis/ 二.  预览如下:

  5. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  6. 利用redis实现分布式事务锁,解决高并发环境下库存扣减

    利用redis实现分布式事务锁,解决高并发环境下库存扣减   问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...

  7. asp.net解决高并发的方案.

    asp.net解决高并发的方案. Posted on 2012-11-27 22:31 75077027 阅读(3964) 评论(1) 编辑 收藏 最近几天一直在读代震军的博客,他是 Discuz!N ...

  8. php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)

    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...

  9. 转发:php解决高并发

    php解决高并发(转发:https://www.cnblogs.com/walblog/articles/8476579.html) 我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Pe ...

随机推荐

  1. 嵌入式实时操作系统μCOS原理与实践+事件部分代码

    //事件等待表的初始化函数:pevent表示事件控制块的指针#if (OS_EVENT_EN)void  OS_EventWaitListInit (OS_EVENT *pevent){    INT ...

  2. 安装hadoop2.4.0遇到的问题

    一.执行start-dfs.sh后,datenode没有启动 查看日志如下: 2014-06-18 20:34:59,622 FATAL org.apache.hadoop.hdfs.server.d ...

  3. iOS多线程介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  4. Java调用动态库方法说明-最详细

    Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...

  5. Office Web Apps资源

    http://www.cnblogs.com/poissonnotes/p/3277280.html#!comments http://www.cnblogs.com/poissonnotes/p/3 ...

  6. ASP.Net 5 上传文件通过虚拟路径存储

    先贴上代码 [HttpPost] public IActionResult ImportTeaching(IFormFile file) { string root = @"Temp/tea ...

  7. centOS 下 VSFTP的安装和设置

    http://blog.csdn.net/swiftshow/article/details/7367609 一.FTP的安装 1.检测是否安装了FTP :[root@localhost ~]# rp ...

  8. JQuery元素获取

    前言:这是本类别博文JQuery即用即查开篇. 因为查手册太麻烦,而且有时候需要深入命令所在详细页面才能了解此命令的具体作用是什么. 写这几篇文章就是为了,工作遇到问题时,一看这几篇文章就可以查到哪个 ...

  9. javascript仿天猫加入购物车动画效果

    javascript仿天猫加入购物车动画效果   注意:首先需要声明的是:代码原思路不是我写的,是在网上找的这种效果,自己使用代码封装了下而已:代码中都有注释,我们最主要的是理解抛物线的思路及在工作中 ...

  10. Sum Root to Leaf Numbers

    int sumNumbers(TreeNode *root) { ); } int dfs(TreeNode *root, int sum) { ; if (root->left == null ...