Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 391|回复: 0

Nginx与Redis解决高并发问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-25 12:56:25 | 显示全部楼层 |阅读模式
    近期刚改版了上月上线的一个产品应用,以应对将来可能的高并发问题。

     

           第一版产品采用的是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的高并发,还怕啥呀!。下图为新的架构主要结构。

     

    Nginx.bmp


            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
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 12:11 , Processed in 0.057729 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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