nginx+lua+redis

Aug 08, 2016 am 09:19 AM
request requests time

最近、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 code:-- 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 code: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 ソリューションは実際にはそれほど変わらないことがわかりました。 。システム全体の開発からデプロイまでの方法と比較すると、nginx + lua の開発とテストは少し面倒です。 接続プールの使い方とテスト結果の補足

前回のテスト後、このコードにはまだ改善の余地があると感じたので、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 コード:

-- 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 サーバー、ab ストレス テストはすべて同じマシン上にあり、相互に影響します。興味がある場合は、個別にデプロイしてテストできます。

上記では、関連する内容も含めて nginx+lua+redis を紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 May 03, 2023 pm 12:49 PM

curl と Pythonrequests は両方とも、HTTP リクエストを送信するための強力なツールです。 curl はターミナルから直接リクエストを送信できるコマンドライン ツールですが、Python のリクエスト ライブラリは、Python コードからリクエストを送信するためのよりプログラム的な方法を提供します。 curl を Pythonrequestscurl コマンドに変換するための基本的な構文は次のとおりです。curl[OPTIONS]URLcurl コマンドを Python リクエストに変換する場合、オプションと URL を Python コードに変換する必要があります。これは、curlPOST コマンドの例です:curl-XPOST https://example.com/api

Python クローラーのリクエスト ライブラリの使用方法 Python クローラーのリクエスト ライブラリの使用方法 May 16, 2023 am 11:46 AM

1. リクエスト ライブラリをインストールします。学習プロセスでは Python 言語を使用するため、Python を事前にインストールする必要があります。私は Python 3.8 をインストールしました。インストールした Python のバージョンは、コマンド python --version を実行することで確認できます。 Python 3.X 以降をインストールします。 Python をインストールした後、次のコマンドを使用してリクエスト ライブラリを直接インストールできます。 pipinstallrequestsPs: Alibaba や Douban などの国内の pip ソースに切り替えることができ、高速です。機能を実証するために、nginx を使用して簡単な Web サイトをシミュレートしました。ダウンロード後、ルート ディレクトリで nginx.exe プログラムを実行するだけです。

PHPリクエストとはどういう意味ですか? PHPリクエストとはどういう意味ですか? Jul 07, 2021 pm 01:49 PM

request の中国語の意味は「要求」で、PHP のグローバル変数であり、「$_POST」、「$_GET」、「$_COOKIE」を含む配列です。 「$_REQUEST」変数は、POSTまたはGETで送信されたデータやCOOKIE情報を取得できます。

タイムパッケージの単調クロック処理 タイムパッケージの単調クロック処理 Aug 04, 2023 pm 05:45 PM

今日は主に golang time パッケージの時間適用方法を見ていきます。この 2 つの間の一般的なルールは、時間を伝えるために「ウォールタイム」が使用され、時間を測定するために「モノトニッククロック」が使用されるということですが、他のクロック処理方法もあります。

Python がリクエストを使用して Web ページをリクエストする方法 Python がリクエストを使用して Web ページをリクエストする方法 Apr 25, 2023 am 09:29 AM

リクエストは urllib2 のすべての機能を継承します。リクエストは、HTTP 接続の永続性と接続プーリング、セッションを維持するための Cookie の使用、ファイルのアップロード、応答コンテンツのエンコードの自動決定、国際化された URL と POST データの自動エンコードをサポートします。インストール方法は、pip を使用してインストールします。 $pipinstallrequestsGET リクエスト 基本的な GET リクエスト (ヘッダー パラメーターとパラメータ パラメーター) 1. 最も基本的な GET リクエストは、get メソッド 'response=requests.get("http://www.baidu.com/ "

urllib.request.urlopen() 関数を使用して Python 3.x で GET リクエストを送信する方法 urllib.request.urlopen() 関数を使用して Python 3.x で GET リクエストを送信する方法 Jul 30, 2023 am 11:28 AM

Python3.x で urllib.request.urlopen() 関数を使用して GET リクエストを送信する方法 ネットワーク プログラミングでは、HTTP リクエストを送信してリモート サーバーからデータを取得する必要があることがよくあります。 Python では、urllib モジュールの urllib.request.urlopen() 関数を使用して、HTTP リクエストを送信し、サーバーから返される応答を取得できます。この記事では使い方を紹介します

Pythonリクエストポストの使い方 Pythonリクエストポストの使い方 Apr 29, 2023 pm 04:52 PM

Python はブラウザーによるポスト リクエストの送信をシミュレートします importrequests 形式 request.postrequest.post(url,data,json,kwargs)#ポスト リクエストの形式 request.get(url,params,kwargs)#get リクエストと比較して、ポスト リクエストの送信パラメータは次のように分割されますForms ( x-www-form-urlencoded) json (application/json) データ パラメーターは、辞書形式と文字列形式をサポートしています。辞書形式は、 json.dumps() メソッドを使用して、データを有効な JSON 形式の文字列に変換します。このメソッドには、次のものが必要です

Python のリクエストと BeautifulSoup を使用して PDF ファイルをダウンロードする Python のリクエストと BeautifulSoup を使用して PDF ファイルをダウンロードする Aug 30, 2023 pm 03:25 PM

Request と BeautifulSoup は、オンラインで任意のファイルまたは PDF をダウンロードできる Python ライブラリです。リクエスト ライブラリは、HTTP リクエストの送信と応答の受信に使用されます。 BeautifulSoup ライブラリは、応答で受け取った HTML を解析し、ダウンロード可能な PDF リンクを取得するために使用されます。この記事では、Python で Request と BeautifulSoup を使用して PDF をダウンロードする方法を学びます。依存関係のインストール Python で BeautifulSoup ライブラリと Request ライブラリを使用する前に、pip コマンドを使用してこれらのライブラリをシステムにインストールする必要があります。 request と BeautifulSoup および Request ライブラリをインストールするには、

See all articles