Eine der einfachsten Möglichkeiten, die Leistung Ihrer Anwendung zu verbessern, besteht darin, eine Caching-Lösung vor Ihre Datenbank zu stellen. In diesem Tutorial zeige ich Ihnen, wie Sie Memcached mit Rails, Django oder Drupal verwenden.
Memcached ist aufgrund seiner soliden Historie, der einfachen Installation und der aktiven Community eine ausgezeichnete Wahl für dieses Problem. Es wird von großen und kleinen Unternehmen genutzt und umfasst Giganten wie Facebook, YouTube und Twitter. Die Memcached-Site selbst beschreibt Memcached als "Freizügiges, Open-Source-Caching-System mit verteiltem Speicherobjekt und generischer Beschaffenheit", das jedoch für die Beschleunigung dynamischer Webanwendungen gedacht ist, indem die Datenbankbelastung verringert wird. "
Im Allgemeinen sind Datenbankaufrufe langsam.
Im Allgemeinen sind Datenbankaufrufe langsam, da für die Abfrage CPU-Ressourcen benötigt werden und Daten (normalerweise) von der Festplatte abgerufen werden. Andererseits benötigt ein In-Memory-Cache wie Memcached sehr wenig CPU-Ressourcen, und die Daten werden statt aus der Festplatte aus dem Speicher abgerufen. Die aufgehellte CPU ist ein Effekt von Memcached's Design. Es ist nicht abfragbar wie eine SQL-Datenbank. Stattdessen werden Schlüssel-Wert-Paare verwendet, um alle Daten abzurufen, und Sie können keine Daten aus Memcached abrufen, ohne dessen Schlüssel zu kennen.
Memcached speichert die Schlüssel-Wert-Paare vollständig im Speicher. Dies macht das Abrufen extrem schnell, macht die Daten jedoch nur flüchtig. Bei einem Absturz oder Neustart wird der Speicher gelöscht und alle Schlüssel / Wert-Paare müssen neu erstellt werden. In Memcached gibt es keine integrierten Hochverfügbarkeits- und / oder Failover-Systeme. Da es sich jedoch um ein verteiltes System handelt, werden Daten auf mehreren Knoten gespeichert. Wenn ein Knoten verloren geht, bedienen die verbleibenden Knoten weiterhin Anforderungen und füllen den fehlenden Knoten aus.
Die Installation von Memcached ist ein ziemlich einfacher Vorgang. Dies kann über einen Paketmanager oder durch Kompilieren aus dem Quellcode erfolgen. Abhängig von Ihrer Distribution möchten Sie möglicherweise aus dem Quellcode kompilieren, da die Pakete tendenziell etwas zurückfallen.
# Installation auf Debian und Ubuntu apt-get install memcached # Installation auf Redhat und Fedora yum install memcached # Installation auf Mac OS X (mit Homebrew) Brüh-Installation memcached # Installation von Source http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && make test sudo make install
Sie möchten Memcached für Ihre speziellen Anforderungen konfigurieren, aber für dieses Beispiel werden wir nur einige grundlegende Einstellungen ausführen.
memcached -m 512 -c 1024 -p 11211 -d
An diesem Punkt sollten Sie mit Memcached arbeiten. Als Nächstes werden wir uns mit Rails, Django und Drupal beschäftigen. Es sei darauf hingewiesen, dass Memcached nicht auf die Verwendung innerhalb eines Frameworks beschränkt ist. Sie können Memcached mit vielen Programmiersprachen über einen der vielen verfügbaren Clients verwenden.
Rails 3 hat das Caching-System so abstrahiert, dass Sie den Client nach Herzenslust ändern können. In Ruby ist Dalli der bevorzugte Memcached-Client.
# Fügen Sie Dalli zu Ihrem Gemfile-Gem 'dalli' hinzu. # Aktivieren Sie Dalli in config /virones / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'
Im Entwicklungsmodus werden Sie normalerweise nicht auf Memcached tippen, also starten Sie Rails entweder im Produktionsmodus mit Schienen-Server -e Produktion
, oder fügen Sie die obigen Zeilen zu Ihrem hinzu config /virones / development.rb
.
Die einfachste Verwendung des Caches ist durch schreiben
/lesen
Methoden zum Abrufen von Daten:
Rails.cache.write 'Hallo', 'Welt' # => true Rails.cache.read 'Hallo' # => "Welt"
Das üblichste Muster für das Zwischenspeichern von Rails ist die Verwendung von holen
. Es wird versucht, den Schlüssel abzurufen (in diesem Fall), teure Abfrage
) und den Wert zurückgeben. Wenn der Schlüssel nicht vorhanden ist, führt er den übergebenen Block aus und speichert das Ergebnis im Schlüssel.
Rails.cache.fetch 'teuer-Abfrage' do Ergebnisse = Transaktion. verbindet (: payment_profile). Joins (: Reihenfolge). where (': created> orders.created_at',: created => Time.now) end #… mehr Code, der mit den Ergebnissen arbeitet
In dem obigen Beispiel ist das Problem der Cache-Ablauf. (Eines der beiden schwerwiegenden Probleme in der Informatik.) Eine fortgeschrittene, sehr robuste Lösung besteht darin, einen Teil der Ergebnisse im Cache-Schlüssel selbst zu verwenden, sodass der Schlüssel automatisch abläuft, wenn sich die Ergebnisse ändern.
users = User.active users.each do | u | Rails.cache.fetch "profile / # u.id / # u.updated_at.to_i" zum Ende des Profils
Hier benutzen wir die Epoche von aktualisiert am
als Teil des Schlüssels, wodurch der Cache-Ablauf abgelaufen ist. Also, wenn die user.updated_at
Wenn sich die Zeit ändert, werden wir einen Cache-Fehler im bereits vorhandenen Profil-Cache feststellen und einen neuen ausschreiben. In diesem Fall müssen wir den Benutzer aktualisieren aktualisiert am
Zeit, wenn ihr Profil aktualisiert wird. Das ist so einfach wie das Hinzufügen:
Klassenprofil < ActiveRecord::Base belongs_to :user, touch: true end
Jetzt haben Sie selbst ablaufende Profile, ohne sich darum kümmern zu müssen, dass alte Daten abgerufen werden, wenn der Benutzer aktualisiert wird. Es ist fast wie Magie!
Sobald Sie Memcached installiert haben, ist es mit Django ziemlich einfach, darauf zuzugreifen. Zunächst müssen Sie eine Clientbibliothek installieren. Wir werden verwenden Pylibmc
.
# Installieren Sie die pylibmc-Bibliothek pip. Installieren Sie pylibmc. # Konfigurieren Sie Cache-Server und Bindungseinstellungen.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0,1: 11211 '
Ihre App sollte jetzt mit Memcached einsatzbereit sein. Wie andere Bibliotheken erhalten Sie grundlegende Getter- und Setter-Methoden, um auf den Cache zuzugreifen:
cache.set ('Hallo', 'Welt') cache.get ('Hallo') # => 'Welt'
Sie können einen Schlüssel bedingt festlegen, wenn er noch nicht vorhanden ist hinzufügen
. Wenn der Schlüssel bereits vorhanden ist, wird der neue Wert ignoriert.
cache.set ('Hallo', 'Welt') cache.add ('Hallo', 'mundus') cache.get ('Hallo') # => 'Welt'
Aus der Python Decorator Library können Sie ein erstellen notiert
Dekorator, um die Ergebnisse eines Methodenaufrufs zwischenzuspeichern.
import Collections importieren functools class memoized (object): "Decorator. Der Rückgabewert einer Funktion wird bei jedem Aufruf zwischengespeichert. Wenn er später mit denselben Argumenten aufgerufen wird, wird der zwischengespeicherte Wert zurückgegeben (nicht erneut ausgewertet)." def __init __ (self, func) : self.func = func self.cache = def __call __ (self, * args): wenn nicht isinstance (args, collection.Hashable): # nicht cachbar. eine Liste zum Beispiel. # Es ist besser, nicht im Cache zu speichern als zu explodieren. return self.func (* args) wenn args in self.cache: return self.cache [args] else: value = self.func (* args) self.cache [args] = value Rückgabewert def __repr __ (self): " Gibt den docstring der Funktion zurück. "Return self.func .__ doc__ def __get __ (self, obj, objtype):" Unterstützte Instanzmethoden. "Return functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" nte Fibonacci-Nummer. " Wenn n in (0, 1): return n return Fibonacci (n-1) + Fibonacci (n-2) Fibonacci drucken (12)
Dekorateure können Ihnen die Möglichkeit geben, den größten Teil des Caching und Cache-Ablaufs zu heben. Beachten Sie bei der Planung Ihres Caching-Systems unbedingt die Beispiele für das Caching in der Decorator Library.
Erste Schritte mit Memcached in Drupal beginnen mit der Installation der PHP-Erweiterung für Memcached.
# Installieren Sie das Memcache-Erweiterungs-Pecl-Installationsprotokoll 'default', '10 .1.1.2: 11212 '=>' default '); ?>
Sie müssen Ihre Anwendung neu starten, damit alle Änderungen wirksam werden.
Wie erwartet erhalten Sie mit dem Modul Memcached die Standardmethoden für Getter und Setter. Ein Vorbehalt ist das cache_get
gibt die Cache-Zeile zurück, sodass Sie auf die darin enthaltenen serialisierten Daten zugreifen müssen.
Daten; # => gibt 'Welt' zurück?>
Und genau so haben Sie in Drupal Caching. Sie können benutzerdefinierte Funktionen erstellen, um Funktionen wie z. B. zu replizieren cache.fetch
in Rails. Mit etwas Planung können Sie eine robuste Caching-Lösung haben, die die Reaktionsfähigkeit Ihrer App auf ein neues Niveau bringt.
Eine gute Caching-Strategie braucht Zeit, um sie zu verfeinern, sollte Sie jedoch nicht davon abhalten, anzufangen.
Die Implementierung eines Caching-Systems kann ziemlich unkompliziert sein. Mit der richtigen Konfiguration kann eine Caching-Lösung die Lebensdauer Ihrer aktuellen Architektur verlängern und Ihre App schneller anfühlen als je zuvor. Eine gute Caching-Strategie braucht Zeit, um sie zu verfeinern, sollte Sie jedoch nicht davon abhalten, anzufangen.
Wie bei jedem komplexen System ist die Überwachung kritisch. Wenn Sie wissen, wie Ihr Cache genutzt wird und wo sich die Hotspots in Ihren Daten befinden, können Sie die Cache-Leistung verbessern. Memcached verfügt über ein Qualitätsstatistiksystem zur Überwachung Ihres Cache-Clusters. Sie sollten auch ein Tool wie New Relic verwenden, um die Balance zwischen Cache und Datenbankzeit im Auge zu behalten. Als zusätzlichen Bonus erhalten Sie ein kostenloses "Data Nerd" -T-Shirt, wenn Sie sich anmelden und bereitstellen.