• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

nginx+lua+redis

php 搞代码 4年前 (2022-01-23) 32次浏览 已收录 0个评论

最近

本文#来源gaodai.ma#com搞##代!^码7网
搞代gaodaima码

在使用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: 100Time taken for tests: 0.458 secondsComplete requests: 1000Failed requests: 0Total transferred: 689000 bytesHTML transferred: 533000 bytesRequests 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] receivedgolang+redis:Concurrency Level: 100Time taken for tests: 0.503 secondsComplete requests: 1000Failed requests: 0Total transferred: 650000 bytesHTML transferred: 532000 bytesRequests 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] receivedlua代码:

— redis 配置localparams={host=127.0.0.1′,port=6379,}localred=redis:new()localok,err=red:connect(params.host,params.port)ifnotokthenngx.say(failed to connect: “,err)returnendlocalposition_key=ngx.var.position_keylocalcontent=red:get(position_key)ngx.print(content)golang代码 :

packagemainimport(“fmt”“github.com/garyburd/redigo/redis”“log”“net/http”“time”)funcgetConn()(redis.Conn,error){conn,err:=redis.DialTimeout(“tcp”,“:6379”,0,1*time.Second,1*time.Second)iferr!=nil{fmt.Println(err)}returnconn,err}funcindexHandler(whttp.ResponseWriter,r*http.Request){conn,err:=getConn()iferr!=nil{http.Error(w,err.Error(),http.StatusInternalServerError)return}result,err:=conn.Do(“get”,“content_1”)iferr!=nil{http.Error(w,err.Error(),http.StatusInternalServerError)return}fmt.Fprintf(w,“Hello, %q”,result)}funcmain(){http.HandleFunc(“/”,indexHandler)err:=http.ListenAndServe(“:8880”,nil)iferr!=nil{log.Fatal(“ListenAndServe: “,err.Error())}}经过多次压测之后发现,nginx + lua + redis的组合确实高效,golang + redis的方案其实也差不了多少。相对于整个系统从开发到部署的方式来说,golang可能更合适,更符合开发的习惯,毕竟nginx + lua 这种方案开发和测试都略显别扭。

补充连接池的使用和测试结果

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

先上结果:

openresty + lua + redisConcurrency Level: 100Time taken for tests: 0.284 secondsComplete requests: 1000Failed requests: 0Total transferred: 687000 bytesHTML transferred: 531000 bytesRequests 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 + redisConcurrency Level: 100Time taken for tests: 0.327 secondsComplete requests: 1000Failed requests: 0Total transferred: 650000 bytesHTML transferred: 532000 bytesRequests 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代码:

— redis 配置localparams={host=127.0.0.1′,port=6379,}localred=redis:new()localok,err=red:connect(params.host,params.port)ifnotokthenngx.say(failed to connect: “,err)returnendlocalposition_key=ngx.var.position_keylocalcontent=red:get(position_key)ngx.print(content)localok,err=red:set_keepalive(10000,100)ifnotokthenngx.say(failed to set keepalive: “,err)returnend

golang代码:

packagemainimport(“flag”“fmt”“github.com/garyburd/redigo/redis”“log”“net/http”“runtime”“time”)var(pool*redis.PoolredisServer=flag.String(“redisServer”,“:6379”,“”))funcindexHandler(whttp.ResponseWriter,r*http.Request){t0:=time.Now()conn:=pool.Get()t1:=time.Now()fmt.Printf(“The call took %v to run.\n”,t1.Sub(t0))deferconn.Close()result,err:=conn.Do(“get”,“content_1”)iferr!=nil{http.Error(w,err.Error(),http.StatusInternalServerError)return}fmt.Fprintf(w,“Hello, %q”,result)}funcnewPool(serverstring)*redis.Pool{return&redis.Pool{MaxIdle:3,IdleTimeout:240*time.Second,Dial:func()(redis.Conn,error){c,err:=redis.Dial(“tcp”,server)iferr!=nil{returnnil,err}returnc,err},TestOnBorrow:func(credis.Conn,ttime.Time)error{_,err:=c.Do(“PING”)returnerr},}}funcmain(){runtime.GOMAXPROCS(runtime.NumCPU())flag.Parse()pool=newPool(*redisServer)http.HandleFunc(“/”,indexHandler)err:=http.ListenAndServe(“:8880”,nil)iferr!=nil{log.Fatal(“ListenAndServe: “,err.Error())}}

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

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:nginx+lua+redis

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址