Ursprünglich wusste ich nie, wie ich die Leistung von Webseiten besser optimieren kann. Als ich dann kürzlich die Rendering-Geschwindigkeit ähnlicher Webseiten in Python und PHP verglich, entdeckte ich versehentlich eine sehr einfache und idiotische Methode, die ich noch nie kannte entdeckt (ich musste mich selbst ärgern): Drucken Sie wie bei einigen PHP-Anwendungen wie dem Discuz-Forum „wie viele Sekunden diese Seite generiert wurde“ in der generierten Webseite aus, und wenn Sie die Webseite dann zum Testen weiter besuchen, können Sie dies tun Finden Sie intuitiv heraus, wie der Betrieb Engpässe verursachen wird.
Also habe ich festgestellt, dass die Erstellung der Homepage durch SimpleCD unerwartet etwa 0,2 Sekunden dauerte. Im Vergleich zur durchschnittlichen Erstellung der Homepage des Discuz-Forums dauerte es nur 0,02 Sekunden, und das Discuz Die Homepage des Forums ist zweifellos länger als die von SimpleCD. Das ist mir peinlich, denn diese Lücke ist definitiv nicht auf die Python-Sprache zurückzuführen. Man kann nur sagen, dass ich sie überhaupt nicht optimiert habe war gut optimiert.
Tatsächlich können Sie ohne Analyse wissen, dass die Datenbank Sie nach unten ziehen muss. Wenn SimpleCD die Homepage generiert, muss es mehr als 42 Abfragen in drei SQLite durchführen Dies ist auf historische Gründe zurückzuführen. Von den mehr als 40 Abfragen handelt es sich jedoch um sehr schnelle Abfragen, und die anderen sind nicht langsam .
Der erste große Schritt ist: Holen Sie sich die Anzahl der Daten
SELECT count(*) FROM verycd
Dieser Vorgang nimmt jedes Mal viel Zeit in Anspruch Dies liegt daran, dass die Datenbank jedes Mal gesperrt und durchlaufen werden muss, um die Anzahl der Primärschlüssel zu zählen. Je größer die Datenmenge, desto zeitaufwändiger ist O (N) und N ist die Größe Tatsächlich ist es sehr einfach, dieses Problem zu lösen. Speichern Sie einfach die aktuelle Datenmenge an einer beliebigen Stelle und ändern Sie sie nur, wenn Sie Daten hinzufügen oder löschen. Die Zeit beträgt also O(1)
Der zweite große Wert Eine davon ist: die neuesten 20 aktualisierten Datenliste abrufen
SELECT verycdid,title,brief,updtime FROM verycd
ORDER BY updtime DESC LIMIT 20;
Weil es Wird auf updtime indiziert, ist die eigentliche Abfragezeit nur die Zeit, den Index zu durchsuchen. Aber warum ist dieser Vorgang langsam? Da meine Daten entsprechend der Veröffentlichungszeit eingefügt werden und die Anzeige entsprechend der Aktualisierungszeit erfolgt, müssen E/A-Vorgänge auf jeden Fall an mindestens 20 verschiedenen Stellen erfolgen, was langsam ist. Die Lösung besteht darin, I/O an einem Ort durchführen zu lassen. Das heißt, sofern die Datenbank keine neuen Daten hinzufügt/die Originaldaten ändert, wird das Rückgabeergebnis dieser Anweisung zwischengespeichert. Das ist 20-mal schneller:)
Die nächsten 20 kleinen Fälle: Informationen zum Herausgeber und zur Klickzahl abrufen
SELECT Owner FROM LOCK WHERE id=XXXX;
SELECT hits FROM stat WHERE id=XXXX;
Warum gibt es hier keine SQL-Join-Anweisung, um Ärger zu vermeiden? Aus architektonischen Gründen werden diese Daten in verschiedenen Datenbanken wie der Klickrate abgelegt. Da sie häufig eingefügt werden müssen, sind Datenbanken wie MySQL Lock und VeryCD erforderlich Tragische Indexnutzung von MySQL. Es wird aufgrund der Paging-Effizienz in der SQLite3-Datenbank gespeichert und kann daher nicht verknüpft werden. -.-
Kurz gesagt, es ist nicht dasselbe wie die Lösung gerade , alles zwischengespeichert
Wenn ich mir also mein Beispiel anschaue, lässt sich die Optimierung der Webseitenleistung auf den Punkt bringen: Datenbankabfragen zwischenspeichern, das ist alles. Ich glaube, die meisten Webanwendungen sind so:)
Endlich ist Memcached an der Reihe. Wenn wir Dateien zum Zwischenspeichern verwenden, wird es immer noch Festplatten-I/ geben. O, warum also nicht direkt? Wenn es im Speicher zwischengespeichert wird, ist die Speicher-E/A viel schneller. Memcached ist also genau wie der Name schon sagt.
Memcached ist ein sehr leistungsfähiges Tool, da es den verteilten Shared-Memory-Cache unterstützen kann. Für kleine Websites ist dies auch eine gute Sache die Homepage Die Größe des Speicherpuffers wird auf nicht mehr als 10 KB geschätzt. Außerdem bin ich jetzt auch ein Speichermagnat. Interessiert mich das immer noch?
Konfiguration und Betrieb: Da es sich um eine eigenständige Maschine handelt und nichts konfiguriert werden muss, ändern Sie einfach den Speicher und den Port
vi /etc/memcached.conf
/etc/init.d /memcached restart
Wird in Python-Webanwendungen verwendet
Memcache importieren
mc = memcache.Client(['127.0.0.1: 11211'], debug=0)
Memcache ist eigentlich eine Kartenstruktur. Am häufigsten werden zwei Funktionen verwendet:
Die erste wird festgelegt (Schlüssel, Wert, Zeitüberschreitung). , dies ist sehr einfach, um den Schlüssel dem Wert zuzuordnen. Timeout bezieht sich auf den Fall, dass die Zuordnung fehlschlägt
Die zweite ist die Funktion get(key), die den Wert zurückgibt, auf den der Schlüssel zeigt
Also für a Eine normale SQL-Abfrage kann so erfolgen
sql = 'select count(*) from verycd'
c = sqlite3.connect('verycd.db').cursor()
# Original Die Verarbeitungsmethode
c.execute(sql)
count = c.fetchone()[0]
# Die aktuelle Verarbeitungsmethode
aus hashlib import md5
key=md5(sql)
count = mc.get(key)
wenn nicht count:
c.execute(sql)
count = c.fetchone()[0]
mc.set(key,count,60*5) #5 Minuten lang speichern
Der Zweck von md5 besteht darin, die Schlüsselverteilung gleichmäßiger zu gestalten. Die anderen Codes sind sehr intuitiv und ich werde sie nicht erklären.
Nach der Optimierung von Aussage 1 und Aussage 2 wurde die durchschnittliche Generierungszeit der Homepage auf 0,02 Sekunden reduziert, was der gleichen Größenordnung wie bei discuz nach der Optimierung von Aussage entspricht 3, schließlich Das Ergebnis ist, dass die Homepage-Generierungszeit auf etwa 0,006 Sekunden reduziert wird. Nach der Optimierung einiger Codezeilen in Memcached wird die Leistung um 3300 % verbessert. Endlich kann ich meinen Rücken aufrichten und Discuz schauen)