0

0

nginx+lua+redis

php中文网

php中文网

发布时间:2016-08-08 09:19:06

|

1253人浏览过

|

来源于php中文网

原创

最近在使用nginx+lua+redis做一个系统,来支撑高并发高访问量的应用。开发时突然想到golang是不是也可以达到同样的效果。于是写了个简单的代码对比一下。具体就不多做介绍了,网上很多关于nginx+lua+redis构建高并发应用的介绍。我使用的是openresty+lua+redis。先贴下测试结果,机器就是2013年新出的低配air——(1.3 GHz Intel Core i5, 4 GB 1600 MHz DDR3), 命令:ab -n 1000 -c 100 http://localhost:8880/
openresty+lua+redis:

Concurrency Level:      100
Time taken for tests:   0.458 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      689000 bytes
HTML transferred:       533000 bytes
Requests per second:    2183.67 [#/sec] (mean)
Time per request:       45.794 [ms] (mean)
Time per request:       0.458 [ms] (mean, across all concurrent requests)
Transfer rate:          1469.29 [Kbytes/sec] received
<pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 color:rgb word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb>golang+redis:

Concurrency Level:      100
Time taken for tests:   0.503 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      650000 bytes
HTML transferred:       532000 bytes
Requests per second:    1988.22 [#/sec] (mean)
Time per request:       50.296 [ms] (mean)
Time per request:       0.503 [ms] (mean, across all concurrent requests)
Transfer rate:          1262.05 [Kbytes/sec] received
<phelvetica neue sans gb font-size:15px>lua代码:<pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 color:rgb word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb><span>-- redis 配置</span><span>local</span><span>params</span><span>=</span><span>{</span><span>host</span><span>=</span><span>'</span><span>127.0.0.1'</span><span>,</span><span>port</span><span>=</span><span>6379</span><span>,</span><span>}</span><span>local</span><span>red</span><span>=</span><span>redis</span><span>:</span><span>new</span><span>()</span><span>local</span><span>ok</span><span>,</span><span>err</span><span>=</span><span>red</span><span>:</span><span>connect</span><span>(</span><span>params</span><span>.</span><span>host</span><span>,</span><span>params</span><span>.</span><span>port</span><span>)</span><span>if</span><span>not</span><span>ok</span><span>then</span><span>ngx</span><span>.</span><span>say</span><span>(</span><span>"</span><span>failed to connect: "</span><span>,</span><span>err</span><span>)</span><span>return</span><span>end</span><span>local</span><span>position_key</span><span>=</span><span>ngx</span><span>.</span><span>var</span><span>.</span><span>position_key</span><span>local</span><span>content</span><span>=</span><span>red</span><span>:</span><span>get</span><span>(</span><span>position_key</span><span>)</span><span>ngx</span><span>.</span><span>print</span><span>(</span><span>content</span><span>)</span><phelvetica neue sans gb font-size:15px>golang代码 :<pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 color:rgb word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb><span>package</span><span>main</span><span>import</span><span>(</span><span>"fmt"</span><span>"github.com/garyburd/redigo/redis"</span><span>"log"</span><span>"net/http"</span><span>"time"</span><span>)</span><span>func</span><span>getConn</span><span>()</span><span>(</span><span>redis</span><span>.</span><span>Conn</span><span>,</span><span>error</span><span>)</span><span>{</span><span>conn</span><span>,</span><span>err</span><span>:=</span><span>redis</span><span>.</span><span>DialTimeout</span><span>(</span><span>"tcp"</span><span>,</span><span>":6379"</span><span>,</span><span>0</span><span>,</span><span>1</span><span>*</span><span>time</span><span>.</span><span>Second</span><span>,</span><span>1</span><span>*</span><span>time</span><span>.</span><span>Second</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>fmt</span><span>.</span><span>Println</span><span>(</span><span>err</span><span>)</span><span>}</span><span>return</span><span>conn</span><span>,</span><span>err</span><span>}</span><span>func</span><span>indexHandler</span><span>(</span><span>w</span><span>http</span><span>.</span><span>ResponseWriter</span><span>,</span><span>r</span><span>*</span><span>http</span><span>.</span><span>Request</span><span>)</span><span>{</span><span>conn</span><span>,</span><span>err</span><span>:=</span><span>getConn</span><span>()</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>http</span><span>.</span><span>Error</span><span>(</span><span>w</span><span>,</span><span>err</span><span>.</span><span>Error</span><span>(),</span><span>http</span><span>.</span><span>StatusInternalServerError</span><span>)</span><span>return</span><span>}</span><span>result</span><span>,</span><span>err</span><span>:=</span><span>conn</span><span>.</span><span>Do</span><span>(</span><span>"get"</span><span>,</span><span>"content_1"</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>http</span><span>.</span><span>Error</span><span>(</span><span>w</span><span>,</span><span>err</span><span>.</span><span>Error</span><span>(),</span><span>http</span><span>.</span><span>StatusInternalServerError</span><span>)</span><span>return</span><span>}</span><span>fmt</span><span>.</span><span>Fprintf</span><span>(</span><span>w</span><span>,</span><span>"Hello, %q"</span><span>,</span><span>result</span><span>)</span><span>}</span><span>func</span><span>main</span><span>()</span><span>{</span><span>http</span><span>.</span><span>HandleFunc</span><span>(</span><span>"/"</span><span>,</span><span>indexHandler</span><span>)</span><span>err</span><span>:=</span><span>http</span><span>.</span><span>ListenAndServe</span><span>(</span><span>":8880"</span><span>,</span><span>nil</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>log</span><span>.</span><span>Fatal</span><span>(</span><span>"ListenAndServe: "</span><span>,</span><span>err</span><span>.</span><span>Error</span><span>())</span><span>}</span><span>}</span><phelvetica neue sans gb font-size:15px>经过多次压测之后发现,nginx + lua + redis的组合确实高效,golang + redis的方案其实也差不了多少。相对于整个系统从开发到部署的方式来说,golang可能更合适,更符合开发的习惯,毕竟nginx + lua 这种方案开发和测试都略显别扭。<divhelvetica neue sans gb font-size:15px line-height:21.4285717010498px><h1helvetica neue font-weight:500 line-height:1.1>补充连接池的使用和测试结果<p>上次测试完之后,觉得这个代码还有提高的空间,于是查了下怎么在golang中使用redis连接池(其实就是redigo的使用),还有lua中怎么使用redis连接池(其实就是rest.redis的使用)。</p>
<p>先上结果:</p>
<pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb>openresty + lua + redis

Concurrency Level:      100
Time taken for tests:   0.284 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      687000 bytes
HTML transferred:       531000 bytes
Requests per second:    3522.03 [#/sec] (mean)
Time per request:       28.393 [ms] (mean)
Time per request:       0.284 [ms] (mean, across all concurrent requests)
Transfer rate:          2362.93 [Kbytes/sec] received
<p>再看golang:</p><pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb>golang + redis

Concurrency Level:      100
Time taken for tests:   0.327 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      650000 bytes
HTML transferred:       532000 bytes
Requests per second:    3058.52 [#/sec] (mean)
Time per request:       32.696 [ms] (mean)
Time per request:       0.327 [ms] (mean, across all concurrent requests)
Transfer rate:          1941.44 [Kbytes/sec] received
<p>lua代码:</p><pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb><span>-- redis 配置</span><span>local</span><span>params</span><span>=</span><span>{</span><span>host</span><span>=</span><span>'</span><span>127.0.0.1'</span><span>,</span><span>port</span><span>=</span><span>6379</span><span>,</span><span>}</span><span>local</span><span>red</span><span>=</span><span>redis</span><span>:</span><span>new</span><span>()</span><span>local</span><span>ok</span><span>,</span><span>err</span><span>=</span><span>red</span><span>:</span><span>connect</span><span>(</span><span>params</span><span>.</span><span>host</span><span>,</span><span>params</span><span>.</span><span>port</span><span>)</span><span>if</span><span>not</span><span>ok</span><span>then</span><span>ngx</span><span>.</span><span>say</span><span>(</span><span>"</span><span>failed to connect: "</span><span>,</span><span>err</span><span>)</span><span>return</span><span>end</span><span>local</span><span>position_key</span><span>=</span><span>ngx</span><span>.</span><span>var</span><span>.</span><span>position_key</span><span>local</span><span>content</span><span>=</span><span>red</span><span>:</span><span>get</span><span>(</span><span>position_key</span><span>)</span><span>ngx</span><span>.</span><span>print</span><span>(</span><span>content</span><span>)</span><span>local</span><span>ok</span><span>,</span><span>err</span><span>=</span><span>red</span><span>:</span><span>set_keepalive</span><span>(</span><span>10000</span><span>,</span><span>100</span><span>)</span><span>if</span><span>not</span><span>ok</span><span>then</span><span>ngx</span><span>.</span><span>say</span><span>(</span><span>"</span><span>failed to set keepalive: "</span><span>,</span><span>err</span><span>)</span><span>return</span><span>end</span><p>golang代码:</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/gongju/1562" title="WinNMP - Windows Nginx MySql Php 8 stack"><img
                                                                                src="https://img.php.cn/upload/manual/000/000/011/169206948898083.png" alt="WinNMP - Windows Nginx MySql Php 8 stack"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/gongju/1562" title="WinNMP - Windows Nginx MySql Php 8 stack">WinNMP - Windows Nginx MySql Php 8 stack</a>
                                                                        <p>WinNMP - Nginx MariaDB Redis Php 8用于Windows的开发堆栈一个轻量、快速、稳定的服务器堆栈,用于在Windows上开发php mysql应用程序,基于出色的Web服务器Nginx。是XAMPP和WAMP的轻量级替代品。也被称为WTServer和wt-nmp当前软件包包含以下最新稳定版本:- Nginx Web服务器- MariaDB 10数据库服务器,mysql替代品(32/64位)- MongoDB 4文档型数据库(64位)- Redis缓存/NoSql,memca</p>
                                                                </div>
                                                                <a href="/xiazai/gongju/1562" title="WinNMP - Windows Nginx MySql Php 8 stack" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><pre class="brush:php;toolbar:false;" courier new font-size:13px white-space:pre-wrap padding:9.5px margin:0px line-height:1.428571429 word-break:break-all word-wrap:break-word border:1px solid rgb background-color:rgb><span>package</span><span>main</span><span>import</span><span>(</span><span>"flag"</span><span>"fmt"</span><span>"github.com/garyburd/redigo/redis"</span><span>"log"</span><span>"net/http"</span><span>"runtime"</span><span>"time"</span><span>)</span><span>var</span><span>(</span><span>pool</span><span>*</span><span>redis</span><span>.</span><span>Pool</span><span>redisServer</span><span>=</span><span>flag</span><span>.</span><span>String</span><span>(</span><span>"redisServer"</span><span>,</span><span>":6379"</span><span>,</span><span>""</span><span>)</span><span>)</span><span>func</span><span>indexHandler</span><span>(</span><span>w</span><span>http</span><span>.</span><span>ResponseWriter</span><span>,</span><span>r</span><span>*</span><span>http</span><span>.</span><span>Request</span><span>)</span><span>{</span><span>t0</span><span>:=</span><span>time</span><span>.</span><span>Now</span><span>()</span><span>conn</span><span>:=</span><span>pool</span><span>.</span><span>Get</span><span>()</span><span>t1</span><span>:=</span><span>time</span><span>.</span><span>Now</span><span>()</span><span>fmt</span><span>.</span><span>Printf</span><span>(</span><span>"The call took %v to run.\n"</span><span>,</span><span>t1</span><span>.</span><span>Sub</span><span>(</span><span>t0</span><span>))</span><span>defer</span><span>conn</span><span>.</span><span>Close</span><span>()</span><span>result</span><span>,</span><span>err</span><span>:=</span><span>conn</span><span>.</span><span>Do</span><span>(</span><span>"get"</span><span>,</span><span>"content_1"</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>http</span><span>.</span><span>Error</span><span>(</span><span>w</span><span>,</span><span>err</span><span>.</span><span>Error</span><span>(),</span><span>http</span><span>.</span><span>StatusInternalServerError</span><span>)</span><span>return</span><span>}</span><span>fmt</span><span>.</span><span>Fprintf</span><span>(</span><span>w</span><span>,</span><span>"Hello, %q"</span><span>,</span><span>result</span><span>)</span><span>}</span><span>func</span><span>newPool</span><span>(</span><span>server</span><span>string</span><span>)</span><span>*</span><span>redis</span><span>.</span><span>Pool</span><span>{</span><span>return</span><span>&</span><span>redis</span><span>.</span><span>Pool</span><span>{</span><span>MaxIdle</span><span>:</span><span>3</span><span>,</span><span>IdleTimeout</span><span>:</span><span>240</span><span>*</span><span>time</span><span>.</span><span>Second</span><span>,</span><span>Dial</span><span>:</span><span>func</span><span>()</span><span>(</span><span>redis</span><span>.</span><span>Conn</span><span>,</span><span>error</span><span>)</span><span>{</span><span>c</span><span>,</span><span>err</span><span>:=</span><span>redis</span><span>.</span><span>Dial</span><span>(</span><span>"tcp"</span><span>,</span><span>server</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>return</span><span>nil</span><span>,</span><span>err</span><span>}</span><span>return</span><span>c</span><span>,</span><span>err</span><span>},</span><span>TestOnBorrow</span><span>:</span><span>func</span><span>(</span><span>c</span><span>redis</span><span>.</span><span>Conn</span><span>,</span><span>t</span><span>time</span><span>.</span><span>Time</span><span>)</span><span>error</span><span>{</span><span>_</span><span>,</span><span>err</span><span>:=</span><span>c</span><span>.</span><span>Do</span><span>(</span><span>"PING"</span><span>)</span><span>return</span><span>err</span><span>},</span><span>}</span><span>}</span><span>func</span><span>main</span><span>()</span><span>{</span><span>runtime</span><span>.</span><span>GOMAXPROCS</span><span>(</span><span>runtime</span><span>.</span><span>NumCPU</span><span>())</span><span>flag</span><span>.</span><span>Parse</span><span>()</span><span>pool</span><span>=</span><span>newPool</span><span>(</span><span>*</span><span>redisServer</span><span>)</span><span>http</span><span>.</span><span>HandleFunc</span><span>(</span><span>"/"</span><span>,</span><span>indexHandler</span><span>)</span><span>err</span><span>:=</span><span>http</span><span>.</span><span>ListenAndServe</span><span>(</span><span>":8880"</span><span>,</span><span>nil</span><span>)</span><span>if</span><span>err</span><span>!=</span><span>nil</span><span>{</span><span>log</span><span>.</span><span>Fatal</span><span>(</span><span>"ListenAndServe: "</span><span>,</span><span>err</span><span>.</span><span>Error</span><span>())</span><span>}</span><span>}</span><p>golang中除了添加了线程池,还设置了cpu核数。</p><p>不过这个测试并不十分严谨,redis,nginx,golang http server,ab压测都在一台机器,相互之间会有影响。有兴趣的可以自己分开部署测试下。</p>
                
                
                <p>
                    以上就介绍了nginx+lua+redis,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。</p>
                <p>
                    </p>
             

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel框架内核源码分析
Laravel框架内核源码分析

共26课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号