Îmbunătățiți performanța aplicației dvs. cu Memcached

Una dintre cele mai ușoare modalități de îmbunătățire a performanței aplicației dvs. este punerea unei soluții de cache în fața bazei dvs. de date. În acest tutorial, vă vom arăta cum să utilizați Memcached cu Rails, Django sau Drupal.

Memcached este o alegere excelentă pentru această problemă, având în vedere istoria sa solidă, instalarea simplă și comunitatea activă. Este folosit de companii mari și mici, și include giganți, cum ar fi Facebook, YouTube și Twitter. Site-ul Memcached, el însuși, face o treabă bună de a descrie Memcached ca un "sistem gratuit de cache open-source, de înaltă performanță, de distribuție a obiectelor de memorie distribuite, generic în natură, dar destinat utilizării în accelerarea aplicațiilor dinamice web prin ameliorarea încărcării bazei de date. "

În general, apelurile bazei de date sunt lente.

În general, apelurile bazei de date sunt lente, deoarece interogarea necesită procesarea resurselor procesorului și date (de obicei) preluate de pe disc. Pe de altă parte, un cache în memorie, ca Memcached, necesită foarte puține resurse ale procesorului, iar datele sunt preluate din memorie în loc de disc. Procesorul luminat este un efect al designului lui Memcached; nu este interogatoriu, ca o bază de date SQL. În schimb, utilizează perechi de chei-valoare pentru a prelua toate datele și nu puteți prelua date din Memacached fără a ști prima dată cheia.

Memcached stochează perechile cheie-valoare în întregime în memorie. Aceasta face ca extragerea să fie extrem de rapidă, dar, de asemenea, face ca datele să fie efemere. În cazul unui accident sau a unei repornii, memoria este ștersă și toate perechile cheie-valoare trebuie reconstruite. Nu există sisteme încorporate de înaltă disponibilitate și / sau sisteme de tip fail-over în Memcached. Cu toate acestea, este un sistem distribuit, astfel încât datele sunt stocate pe mai multe noduri. Dacă un nod este pierdut, nodurile rămase execută cereri de difuzare și completarea pentru nodul lipsă.

Instalarea Memacached

Instalarea Memcached este un proces destul de simplu. Se poate face printr-un manager de pachete sau prin compilarea acestuia din sursă. În funcție de distribuția dvs., vă recomandăm să compilați din sursă, deoarece pachetele tind să scadă puțin.

# Instalare pe Debian și Ubuntu apt-get install memcached # Instalați pe Redhat și Fedora yum install memcached # Instalați pe Mac OS X (cu Homebrew) instalați instalarea memcached # Instalați din sursă obțineți http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && face test sudo make install

Veți dori să configurați Memcached pentru nevoile dvs. specifice, dar, pentru acest exemplu, vom face să ruleze cu câteva setări de bază.

memorat -m 512 -c 1024 -p 11211 -d

În acest moment, ar trebui să fii susținut cu Memcached. Apoi, vom analiza cum să îl folosim cu Rails, Django și Drupal. Trebuie remarcat faptul că Memcached nu este limitat la utilizarea într-un cadru. Puteți utiliza Memcached cu multe limbi de programare prin unul dintre multele clienți disponibili.

Folosind Memacached cu Rails 3

Rails 3 a abstractizat sistemul de caching astfel încât să puteți schimba clientul la dorința inimii. În Ruby, clientul preferat Memcached este Dalli.

# Adăugați Dalli la gemul dvs. Gemfile 'dalli' # Activați Dalli în config / environments / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'

În modul de dezvoltare, nu veți lovi în mod normal Memacached, deci începeți Rails în modul de producție cu rails server-e de producție, sau adăugați liniile de mai sus la dvs. config / medii / development.rb.

Este folosită cea mai simplă utilizare a memoriei cache scrie/citit metode de recuperare a datelor:

Rails.cache.write 'hello', 'world' # => true Rails.cache.read 'salut' # => "lumea"

Se folosește modelul cel mai comun pentru cache-ul Rails aduce. Acesta va încerca să recupereze cheia (în acest caz, costisitoare interogare) și returnați valoarea. Dacă cheia nu există, va executa blocul trecut și va stoca rezultatul în cheie.

Rails.cache.fetch 'scump-interogare' face rezultate = Tranzacție. se alătură (: payment_profile). se alătură (: comanda). unde (': creat> orders.created_at',: created => Time.now) end # ... mai mult cod de lucru cu rezultate

În exemplul de mai sus, problema este expirarea memoriei cache. (Una dintre cele două probleme dificile din domeniul informaticii). O soluție avansată și foarte robustă este de a folosi o parte din rezultate în cheia cache-ului în sine, astfel încât, dacă rezultatele se schimbă, atunci tasta expiră automat.

utilizatori = Utilizatori.activați utilizatori.each do | u | Rails.cache.fetch "profil / # u.id / # u.updated_at.to_i" face u.profile end end

Aici, folosim epoca lui updated_at ca parte a cheii, ceea ce ne dă expirări construite în cache. Deci, dacă user.updated_at modificări de timp, vom primi o memorie cache pe cache-ul de profil pre-existent și vom scrie o nouă. În acest caz, va trebui să actualizăm utilizatorul updated_at când profilul lor este actualizat. Acest lucru este la fel de simplu ca adăugarea:

Profilul clasei < ActiveRecord::Base belongs_to :user, touch: true end

Acum, aveți profiluri cu auto-expirare fără a vă faceți griji cu privire la recuperarea datelor vechi atunci când utilizatorul este actualizat. E aproape ca magia!

Folosind Memcached cu Django

Odată ce ați instalat Memcached, este destul de simplu să accesați cu Django. În primul rând, va trebui să instalați o bibliotecă de clienți. Vom folosi pylibmc.

# Instalați biblioteca pylibmc pip install pylibmc # Configurați serverele cache și legarea settings.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0,1: 11211 ',

Aplicația dvs. ar trebui să funcționeze acum cu Memcached. Ca și în alte biblioteci, veți obține metode de bază pentru getter și setter pentru a accesa memoria cache:

cache.set ('hello', 'lume') cache.get ('hello') # => 'lume'

Puteți seta în mod condiționat o cheie dacă nu există deja cu adăuga. Dacă cheia există deja, noua valoare va fi ignorată.

cache.set ('salut') # => 'lume' cache.set ('hello', 'lume') cache.add ('hello', 'mundus'

Din Biblioteca de decorare Python, puteți crea creați un memoized decorator pentru a cache rezultatele unui apel metoda.

importul colecțiilor import functools class memoized (object): "Decorator" Cache a valorii returnate a unei funcții de fiecare dată când este apelată.Dacă este chemată mai târziu cu aceleași argumente, valoarea cache este returnată (nu este reevaluată) "def __init __ (self, func) : self.func = func self.cache =  def __call __ (self, * args): dacă nu este instanță (args, collections.Hashable): # uncacheable. o listă, de exemplu. # mai bine să nu cache decât arunca în aer. returnează self.func (* args) dacă args în self.cache: return self.cache [args] else: value = auto.func (* args) self.cache [args] = value return value def __repr __ (self) Returnați docstringul funcției "return self.func .__ doc__ def __get __ (self, obj, objtype):" Metode de instanță suport "return functools.partial (self .__ call__, obj) @memoized def fibonacci (n) nth fibonacci număr. " dacă n în (0, 1): return n return fibonacci (n-1) + fibonacci (n-2) imprimare fibonacci (12)

Decoratorii vă pot oferi puterea de a lua cea mai mare parte a ridicării grele a cache-ului și a expirării cache-ului. Asigurați-vă că ați aruncat o privire asupra exemplelor de cache din Biblioteca Decorator în timp ce planificați sistemul de cache.

Folosind Memcached cu Drupal

Noțiuni introductive despre Memcached în Drupal începe cu instalarea extensiei PHP pentru Memcached.

# Instalați extensia Memcached pecl install memcache   'default', '10 .1.1.2: 11212 '=>' implicit '); ?>

Va trebui să reporniți aplicația pentru ca toate modificările să aibă efect.

După cum era de așteptat, veți obține metodele standard de achiziție și setter cu modulul Memacached. Un avertisment este acela cache_get returnează rândul cache-ului, deci va trebui să accesați datele serializate din cadrul acestuia.

date; # => returnează "lumea"?

Și așa, ați primit cache-ul în Drupal. Puteți construi funcții personalizate pentru a replica funcționalități, cum ar fi cache.fetch în Rails. Cu puțină planificare, puteți avea o soluție robustă de stocare în cache, care va aduce răspunsul aplicației dvs. la un nou nivel.

Și tu ești făcut

În timp ce o strategie de caching bună necesită timp pentru a rafina, nu ar trebui să vă oprească de la început.

Implementarea unui sistem de cache poate fi destul de simplă. Cu configurația potrivită, o soluție de cache poate prelungi durata de viață a arhitecturii dvs. actuale și poate face aplicația să se simtă mai bine decât oricând. În timp ce o strategie de caching bună necesită timp pentru a rafina, nu ar trebui să vă oprească de la început.

Ca și în cazul oricărui sistem complex, monitorizarea este critică. Înțelegerea modului în care cache-ul dvs. este utilizat și unde sunt în memoria datelor hotspot-urile vă va ajuta să vă îmbunătățiți performanța cache-ului. Memcached are un sistem de statistici de calitate care vă ajută să monitorizați clusterul cache-ului. De asemenea, ar trebui să utilizați un instrument, cum ar fi New Relic, pentru a ține cont de echilibrul dintre cache și timpul de bază de date. Ca un bonus suplimentar, puteți obține un tricou liber "Data Nerd" atunci când vă înscrieți și desfășurați.

Cod