Nginx与Redis解决高并发问题

简介: 原文链接:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=229629 近期刚改版了上月上线的一个产品应用,以应对将来可能的高并发问题。          第一版产品采用的是Jquery,Nginx,PHP(CI框架),Memcache,Mysql这种常用的架构。
近期刚改版了上月上线的一个产品应用,以应对将来可能的高并发问题。

 

       第一版产品采用的是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
如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
9月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2493 7
|
10月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
783 3
|
缓存 NoSQL 架构师
Redis批量查询的四种技巧,应对高并发场景的利器!
在高并发场景下,巧妙地利用缓存批量查询技巧能够显著提高系统性能。 在笔者看来,熟练掌握细粒度的缓存使用是每位架构师必备的技能。因此,在本文中,我们将深入探讨 Redis 中批量查询的一些技巧,希望能够给你带来一些启发。
Redis批量查询的四种技巧,应对高并发场景的利器!
|
存储 缓存 NoSQL
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
391 1
|
缓存 NoSQL 关系型数据库
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
310 1
|
监控 NoSQL 应用服务中间件
elk+redis 搭建nginx日志分析平台
elk+redis 搭建nginx日志分析平台 logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录。
1602 0
|
10月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
5月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
6月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
291 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1361 0

热门文章

最新文章