Forbedre Appens ytelse med Memcached

En av de enkleste måtene å forbedre programmets ytelse er å sette en caching-løsning foran databasen. I denne opplæringen viser jeg deg hvordan du bruker Memcached med Rails, Django eller Drupal.

Memcached er et utmerket valg for dette problemet, gitt sin solide historie, enkel installasjon og aktivt samfunn. Den brukes av selskaper stor og liten, og inkluderer giganter, som Facebook, YouTube og Twitter. Den Memcached-siden, selv, gjør en god jobb med å beskrive Memcached som et "Free & Open Source, høypresterende, distribuert minneobjekt-system, generisk i naturen, men beregnet til bruk for å øke dynamiske webapplikasjoner ved å lette databasebelastningen. "

Generelt er databasesamtaler sakte.

Generelt er databasesamtaler sakte, siden spørringen tar CPU-ressurser til å behandle og data blir (vanligvis) hentet fra disken. På den annen side tar en cache i minnet, som Memcached, svært lite CPU-ressurser, og data hentes fra minnet i stedet for disk. Den lette CPU er en effekt av Memcacheds design; Det er ikke spørringsmessig, som en SQL-database. I stedet bruker det nøkkelverdepar for å hente alle dataene, og du kan ikke hente data fra Memcached uten å først vite nøkkelen.

Memcached lagrer nøkkelverdien par helt i minnet. Dette gjør henting ekstremt rask, men også gjør det slik at dataene er flyktige. I tilfelle en krasj eller omstart, blir minnet ryddet og alle nøkkelverdiparene må gjenoppbygges. Det er ingen innebygde høy tilgjengelighet og / eller fail-over systemer innenfor Memcached. Det er imidlertid et distribuert system, slik at data lagres over flere noder. Hvis en knute går tapt, fortsetter de resterende knutepunktene til å betjene forespørsler og fyller inn for manglende knutepunkt.

Installere Memcached

Installere Memcached er en ganske enkel prosess. Det kan gjøres gjennom en pakkebehandling eller ved å samle den fra kilden. Avhengig av distribusjonen din, vil du kanskje kompilere fra kilde, siden pakkene har en tendens til å falle litt bak.

# Installer på Debian og Ubuntu apt-get install memcached # Installer på Redhat og Fedora yum installer memcached # Installer på Mac OS X (med Homebrew) brew install memcached # Installer fra Source få http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure gjør && gjør test sudo gjør installasjon

Du vil konfigurere Memcached for dine spesifikke behov, men for dette eksempelet vil vi bare få det til å kjøre med noen grunnleggende innstillinger.

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

På dette tidspunktet bør du være oppe med Memcached. Deretter ser vi på hvordan du bruker den med Rails, Django og Drupal. Det skal bemerkes at Memcached ikke er begrenset til bruk innenfor rammen. Du kan bruke Memcached med mange programmeringsspråk gjennom en av de mange klientene som er tilgjengelige.

Bruke Memcached med Rails 3

Rails 3 har abstrakt caching systemet slik at du kan forandre klienten til ditt hjertes ønske. I Ruby er den foretrukne Memcached-klienten Dalli.

# Legg til Dalli til Gemfile gem 'dalli' # Aktiver Dalli i config / environments / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'

I utviklingsmodus, vil du vanligvis ikke slå Memcached, så start Rails i produksjonsmodus med rails server -e produksjon, eller legg til linjene ovenfor til din konfig / miljøer / development.rb.

Den enkleste bruken av hurtigbufferen er gjennom skrive/lese metoder for å hente data:

Rails.cache.write 'hello', 'world' # => ekte Rails.cache.read 'hello' # => "verden"

Det vanligste mønsteret for Rails caching bruker hente. Det vil forsøke å hente nøkkelen (i dette tilfellet, dyre-spørring) og returnere verdien. Hvis nøkkelen ikke eksisterer, vil den utføre den bestått blokk og lagre resultatet i nøkkelen.

Rails.cache.fetch 'dyre spørring' gjør resultater = Transaksjon. tiltrer (: payment_profile). tiltrer (: rekkefølge). hvor (': opprettet> orders.created_at',: created => Time.now) slutt # ... mer kode som arbeider med resultater

I eksemplet ovenfor er problemet et cache-utløp. (En av de to vanskelige problemene innen datavitenskap.) En avansert, veldig robust løsning er å bruke noen del av resultatene i hurtigbuffertasten selv, slik at hvis resultatene endres, blir nøkkelen utløpt automatisk.

users = User.active users.each do | u | Rails.cache.fetch "profil / # u.id / # u.updated_at.to_i" gjør u.profile endeenden

Her bruker vi epoken til updated_at som en del av nøkkelen, som gir oss bygget i cache-utløp. Så, hvis user.updated_at tidsendringer, vil vi få en bufferfeil på den eksisterende profilbufferen og skrive ut en ny. I dette tilfellet må vi oppdatere brukerens updated_at når deres profil er oppdatert. Det er så enkelt som å legge til:

klasse profil < ActiveRecord::Base belongs_to :user, touch: true end

Nå har du selvutløpende profiler uten å bekymre deg for å hente gamle data når brukeren er oppdatert. Det er nesten som magi!

Bruke Memcached med Django

Når du har installert Memcached, er det ganske enkelt å få tilgang til Django. Først må du installere et klientbibliotek. Vi skal bruke pylibmc.

# Installer pylibmc biblioteket pip install pylibmc # Konfigurer cache servere og bindende settings.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0,1: 11211 ',

Appen din skal være oppe med Memcached nå. Som andre biblioteker får du grunnleggende getter og setter metoder for å få tilgang til hurtigbufferen:

cache.set ('hei', 'world') cache.get ('hei') # => 'verden'

Du kan betinget sette en nøkkel hvis den ikke allerede eksisterer med Legg til. Hvis nøkkelen allerede eksisterer, ignoreres den nye verdien.

cache.set ('hei', 'world') cache.add ('hei', 'mundus') cache.get ('hei') # => 'verden'

Fra Python Decorator Library kan du opprette en memoized dekoratør for å cache resultatene av en metodeanrop.

importere samlinger importere functools klasse memoized (objekt): "Decorator. Caches en funksjonens returverdi hver gang den kalles. Hvis den blir ringt senere med de samme argumentene, blir den bufrede verdien returnert (ikke revurdert)." def __init __ (self, func) : self.func = func self.cache =  def __call __ (selv, * args): hvis ikke isinstance (args, collections.Hashable): # uncacheable. en liste, for eksempel. # bedre å ikke cache enn sprenge opp. return self.func (* args) hvis args i self.cache: return self.cache [args] ellers: value = self.func (* args) self.cache [args] = verdi returverdi def __repr __ (selv): " Retur funksjonens dokstring. "Returner selv.func .__ doc__ def __get __ (selv, obj, objtype):" Support instans metoder. "Return functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" Return nth fibonacci nummer. " hvis n i (0, 1): retur n retur fibonacci (n-1) + fibonacci (n-2) print fibonacci (12)

Dekoratører kan gi deg muligheten til å ta det meste av det tunge løfte ut av caching og cache-utløp. Husk å ta en titt på caching-eksemplene i Decorator Library mens du planlegger caching-systemet ditt.

Bruke Memcached med Drupal

Komme i gang med Memcached i Drupal starter med å installere PHP-utvidelsen for Memcached.

# Installer Memcached Extensions-installeringsmemcache   'standard', '10 .1.1.2: 11212 '=>' standard '); ?>

Du må starte programmet på nytt for at alle endringene skal tre i kraft.

Som forventet får du standard getter og setter-metoder med Memcached-modulen. En advarsel er det cache_get returnerer hurtigruten, slik at du må få tilgang til de serialiserte dataene i den.

data; # => returnerer 'verden'?>

Og akkurat slik har du caching på plass i Drupal. Du kan bygge tilpassede funksjoner for å gjenskape funksjonalitet som cache.fetch i skinner. Med litt planlegging kan du ha en robust caching løsning som vil gi appens respons til et nytt nivå.

Og du er ferdig

Mens en god caching-strategi tar deg tid til å avgrense, bør det ikke stoppe deg fra å komme i gang.

Implementering av et caching system kan være ganske grei. Med riktig konfigurasjon kan en caching-løsning forlenge levetiden til din nåværende arkitektur og gjøre appen din snappier enn den noensinne har hatt før. Mens en god caching-strategi tar deg tid til å avgrense, bør det ikke stoppe deg fra å komme i gang.

Som med et komplekst system er overvåking kritisk. Forstå hvordan cachen din blir brukt og hvor hotspots er i dataene dine, vil hjelpe deg med å forbedre cacheytelsen din. Memcached har et kvalitetsstatistikksystem som hjelper deg med å overvåke hurtigbufferklokken din. Du bør også bruke et verktøy, som New Relic, for å holde øye med balansen mellom cache og database tid. Som en ekstra bonus, kan du få en gratis 'Data Nerd' t-skjorte når du registrerer deg og distribuerer.