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
<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>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>上次测试完之后,觉得这个代码还有提高的空间,于是查了下怎么在golang中使用redis连接池(其实就是redigo的使用),还有lua中怎么使用redis连接池(其实就是rest.redis的使用)。
先上结果:
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
再看golang:
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
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)returnendgolang代码:
<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教程有兴趣的朋友有所帮助。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号