Nginx Lua Redis

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

Vor Kurzem verwende ich nginx+lua+redis, um ein System zur Unterstützung von Anwendungen mit hoher Parallelität und hohem Datenverkehr aufzubauen. Während der Entwicklung dachte ich plötzlich, ob Golang den gleichen Effekt erzielen könnte. Also habe ich einen einfachen Code zum Vergleich geschrieben. Ich werde nicht auf Details eingehen. Im Internet gibt es viele Einführungen zum Erstellen von Anwendungen mit hoher Parallelität. Ich verwende openresty+lua+redis. Veröffentlichen Sie zuerst die Testergebnisse. Bei der Maschine handelt es sich um die neue Low-Profile-Air, die 2013 herausgebracht wurde – (1,3 GHz Intel Core i5, 4 GB 1600 MHz DDR3), Befehl: 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())}} nach vielen Mal Nach Stresstests haben wir festgestellt, dass die Kombination von Nginx + Lua + Redis tatsächlich effizient ist und die Lösung von Golang + Redis nicht viel anders ist. Verglichen mit der Art und Weise, wie das gesamte System entwickelt und bereitgestellt wird, ist Golang möglicherweise besser geeignet und entspricht eher den Entwicklungsgewohnheiten. Schließlich ist die Entwicklung und das Testen von Nginx + Lua etwas umständlich. Zusätzliche Verbindungspoolnutzung und Testergebnisse

Nach dem letzten Test hatte ich das Gefühl, dass es in diesem Code Raum für Verbesserungen gibt, also habe ich überprüft, wie man den Redis-Verbindungspool in Golang verwendet (Tatsächlich handelt es sich um die Verwendung von Redigo) und um die Verwendung des Redis-Verbindungspools in Lua (tatsächlich handelt es sich um die Verwendung von rest.redis).

Zuerst zu den Ergebnissen gehen:

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

Dann schauen Sie sich Golang an:

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

Golang-Code:

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 fügt nicht nur einen Thread-Pool hinzu, sondern legt auch die Anzahl der CPU-Kerne fest.

Dieser Test ist jedoch nicht sehr streng. Redis, Nginx, der Golang-HTTP-Server und der AB-Stresstest befinden sich alle auf demselben Computer und beeinflussen sich gegenseitig. Wenn Sie interessiert sind, können Sie es separat bereitstellen und testen.

Das Obige hat Nginx Lua Redis vorgestellt, einschließlich einiger Aspekte davon. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So realisieren Sie die gegenseitige Konvertierung zwischen CURL- und Python-Anfragen in Python So realisieren Sie die gegenseitige Konvertierung zwischen CURL- und Python-Anfragen in Python May 03, 2023 pm 12:49 PM

Sowohl Curl als auch Pythonrequests sind leistungsstarke Tools zum Senden von HTTP-Anfragen. Während Curl ein Befehlszeilentool ist, mit dem Sie Anfragen direkt vom Terminal aus senden können, bietet die Requests-Bibliothek von Python eine eher programmatische Möglichkeit, Anfragen aus Python-Code zu senden. Die grundlegende Syntax zum Konvertieren des Curl-Befehls in den Pythonrequestscurl-Befehl lautet wie folgt: curl[OPTIONS]URL Beim Konvertieren des Curl-Befehls in eine Python-Anfrage müssen wir die Optionen und die URL in Python-Code konvertieren. Hier ist ein Beispiel für einen CurlPOST-Befehl: curl-XPOST https://example.com/api

So verwenden Sie die Python-Crawler-Requests-Bibliothek So verwenden Sie die Python-Crawler-Requests-Bibliothek May 16, 2023 am 11:46 AM

1. Installieren Sie die Anforderungsbibliothek. Python muss vorab installiert werden. Sie können die installierte Python-Version überprüfen, indem Sie den Befehl python --version ausführen um Python 3.X oder höher zu installieren. Nach der Installation von Python können Sie die Anforderungsbibliothek über den folgenden Befehl direkt installieren. pipinstallrequestsPs: Sie können zu inländischen Pip-Quellen wie Alibaba und Douban wechseln, die schnell sind. Um die Funktion zu demonstrieren, habe ich Nginx verwendet, um eine einfache Website zu simulieren. Führen Sie nach dem Herunterladen einfach das Programm nginx.exe im Stammverzeichnis aus.

Was bedeutet PHP-Anfrage? Was bedeutet PHP-Anfrage? Jul 07, 2021 pm 01:49 PM

Die chinesische Bedeutung von request ist „request“. Es ist eine globale Variable in PHP und ein Array, das „$_POST“, „$_GET“ und „$_COOKIE“ enthält. Die Variable „$_REQUEST“ kann per POST oder GET übermittelte Daten und COOKIE-Informationen abrufen.

Monotone Taktverarbeitung des Zeitpakets Monotone Taktverarbeitung des Zeitpakets Aug 04, 2023 pm 05:45 PM

Heute werfen wir hauptsächlich einen Blick auf die Zeitanwendungsmethode des Golang-Zeitpakets. Die allgemeine Regel zwischen den beiden ist, dass „Wandzeit“ zur Angabe der Zeit und „monotone Uhr“ zur Zeitmessung verwendet wird. Es gibt andere Methoden zur Uhrenverarbeitung.

So verwenden Sie die Funktion urllib.request.urlopen() zum Senden einer GET-Anfrage in Python 3.x So verwenden Sie die Funktion urllib.request.urlopen() zum Senden einer GET-Anfrage in Python 3.x Jul 30, 2023 am 11:28 AM

So verwenden Sie die Funktion urllib.request.urlopen() in Python3.x, um eine GET-Anfrage zu senden. Bei der Netzwerkprogrammierung müssen wir häufig Daten von einem Remote-Server erhalten, indem wir eine HTTP-Anfrage senden. In Python können wir die Funktion urllib.request.urlopen() im Modul urllib verwenden, um eine HTTP-Anfrage zu senden und die vom Server zurückgegebene Antwort zu erhalten. In diesem Artikel wird die Verwendung vorgestellt

Wie Python Requests zum Anfordern von Webseiten verwendet Wie Python Requests zum Anfordern von Webseiten verwendet Apr 25, 2023 am 09:29 AM

Requests erbt alle Funktionen von urllib2. Requests unterstützt HTTP-Verbindungspersistenz und Verbindungspooling, unterstützt die Verwendung von Cookies zur Aufrechterhaltung von Sitzungen, unterstützt das Hochladen von Dateien, unterstützt die automatische Bestimmung der Kodierung von Antwortinhalten und unterstützt internationalisierte URLs und die automatische Kodierung von POST-Daten. Die Installationsmethode verwendet pip, um $pipinstallrequests zu installieren. Grundlegende GET-Anforderungen (Header- und Parmas-Parameter) anfordern. 1. Die grundlegendste GET-Anfrage kann direkt mit der Get-Methode „response=requests.get(“http://www.baidu.com/“ verwendet werden. &quot

Beitrag zur Verwendung von Python-Anfragen Beitrag zur Verwendung von Python-Anfragen Apr 29, 2023 pm 04:52 PM

Python simuliert den Browser, der Post-Anfragen im Importrequests-Format sendet request.postrequest.post(url,data,json,kwargs)#Post-Anforderungsformat request.get(url,params,kwargs)#Im Vergleich zur Get-Anfrage sind die Parameter für das Senden von Post-Anfragen unterteilt Der Datenparameter „forms“ (x-www-form-urlencoded) unterstützt das Wörterbuchformat und das Zeichenfolgenformat. Das Wörterbuchformat verwendet die Methode json.dumps(), um die Daten in eine Zeichenfolge im legalen JSON-Format zu konvertieren

Laden Sie PDF-Dateien mit Pythons Requests und BeautifulSoup herunter Laden Sie PDF-Dateien mit Pythons Requests und BeautifulSoup herunter Aug 30, 2023 pm 03:25 PM

Request und BeautifulSoup sind Python-Bibliotheken, die jede Datei oder jedes PDF online herunterladen können. Die Anforderungsbibliothek wird zum Senden von HTTP-Anforderungen und zum Empfangen von Antworten verwendet. Die BeautifulSoup-Bibliothek wird verwendet, um den in der Antwort empfangenen HTML-Code zu analysieren und den herunterladbaren PDF-Link zu erhalten. In diesem Artikel erfahren Sie, wie Sie PDFs mit Request und BeautifulSoup in Python herunterladen. Abhängigkeiten installieren Bevor wir die BeautifulSoup- und Request-Bibliotheken in Python verwenden, müssen wir diese Bibliotheken mit dem Befehl pip im System installieren. Um request und die BeautifulSoup- und Request-Bibliotheken zu installieren,

See all articles