第一版产品采用的是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. PHP中soap的使用例子

    PHP 使用soap有两种方式. 一.用wsdl文件 服务器端. <?phpclass service{ public function HelloWorld() { return " ...

  2. Redux初探与异步数据流

    基本认知 先贴一张redux的基本结构图 原图来自<UNIDIRECTIONAL USER INTERFACE ARCHITECTURES> 在这张图中,我们可以很清晰的看到,view中产 ...

  3. jprofiler安装与使用

    1: 修改/etc/profile 增加以下内容: JPROFILER_HOME=/opt/jprofiler9/bin/linux-x64export LD_LIBRARY_PATH=$LD_LIB ...

  4. MyEclipse------如何在特定目录下创建文件夹

    Directory.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  5. PHP利用Filesystem函数实现操作缓存(生成,获取,删除操作)

    <?php class File{ //$key 相当于缓存文件的文件名 //$value 缓存数据 private $_dir;//定义默认路径 const EXT='.txt'; publi ...

  6. 深入理解 Javascript 面向对象编程

    一:理解构造函数原型(prototype)机制 prototype是javascript实现与管理继承的一种机制,也是面向对象的设计思想.构造函数的原型存储着引用对象的一个指针,该指针指向与一个原型对 ...

  7. 批量删除亚马逊kindle云端文档

    首先鄙视亚马逊的不负责任,kindle的云端管理系统犹如一坨狗屎,根本没有考虑的任何用户体验,只能一个一个删除不说,删除后又回到第一页...翻页也没有输入页码的地方,如果在第100页删除文档后,又回到 ...

  8. acdream.Triangles(数学推导)

    Triangles Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit Stat ...

  9. 在Mysql中如何显示所有用户?

    这是一个mysql初学者经常问到的一个问题,今天我们就带大家看看是如何在Mysql中显示所有用户的.通常我们在mysql中使用SHOW DATABASES可以显示所有的数据库,SHOW TABLES将 ...

  10. Unity3D研究之Prefab里面的Prefab关联问题

    Unity研究院之Prefab和GameObject的正向和逆向查找引用 我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作 ...