nginx+lua+redis

php中文网
发布: 2016-08-08 09:19:06
原创
1248人浏览过
最近在使用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
登录后复制
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
登录后复制
lua代码:
<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>
登录后复制
golang代码 :
<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>
登录后复制
经过多次压测之后发现,nginx + lua + redis的组合确实高效,golang + redis的方案其实也差不了多少。相对于整个系统从开发到部署的方式来说,golang可能更合适,更符合开发的习惯,毕竟nginx + lua 这种方案开发和测试都略显别扭。补充连接池的使用和测试结果

上次测试完之后,觉得这个代码还有提高的空间,于是查了下怎么在golang中使用redis连接池(其实就是redigo的使用),还有lua中怎么使用redis连接池(其实就是rest.redis的使用)。

先上结果:

openresty &#43; lua &#43; 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
登录后复制

再看golang:

golang &#43; 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
登录后复制

lua代码:

<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>localok,err=red:set_keepalive(10000,100)ifnotokthenngx.say("failed to set keepalive: ",err)returnend
登录后复制

golang代码:

《Redis实战》红丸出品
《Redis实战》红丸出品

《Redis实战》红丸出品

《Redis实战》红丸出品 298
查看详情 《Redis实战》红丸出品
<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>
登录后复制

golang中除了添加了线程池,还设置了cpu核数。

不过这个测试并不十分严谨,redis,nginx,golang http server,ab压测都在一台机器,相互之间会有影响。有兴趣的可以自己分开部署测试下。

以上就介绍了nginx+lua+redis,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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