Förbättra din apps prestanda med Memcached

Ett av de enklaste sätten att förbättra programmets prestanda är att lägga en cache-lösning framför din databas. I den här handledningen visar jag dig hur du använder Memcached med Rails, Django eller Drupal.

Memcached är ett utmärkt val för detta problem, med tanke på sin solida historia, enkel installation och aktivt samhälle. Det används av företag stora och små, och inkluderar jättar, som Facebook, YouTube och Twitter. Memcached-enheten, självt, gör ett bra jobb att beskriva Memcached som ett "Free & Open Source, högpresterande, distribuerat minnesobjektkachningssystem, generiskt i naturen, men menat att användas för att påskynda dynamiska webbapplikationer genom att lätta databasbelastningen. "

I allmänhet är databassamtal långsamma.

Generellt är databassamtal långsamma, eftersom frågan tar CPU-resurser att bearbeta och data (vanligtvis) hämtas från disken. Å andra sidan tar en minnescache, som Memcached, mycket små CPU-resurser och data hämtas från minnet istället för disken. Den upplysta CPU är en effekt av Memcacheds design; Det är inte fråga, som en SQL-databas. Istället använder den nyckelparametrar för att hämta alla data och du kan inte hämta data från Memcached utan att först veta dess nyckel.

Memcached lagrar nyckelvärdesparen helt i minnet. Detta gör hämtningen extremt snabb, men gör det också så att data är efemär. I händelse av en krasch eller omstart, raderas minnet och alla nyckelvärdespar måste byggas om. Det finns inga inbyggda hög tillgänglighet och / eller fail-over-system inom Memcached. Det är dock ett distribuerat system, så data lagras över flera noder. Om en nod går förlorad fortsätter de återstående noderna betjäningsförfrågningarna och fyller i för den saknade noden.

Installera Memcached

Installera Memcached är en ganska enkel process. Det kan göras genom en pakethanterare eller genom att sammanställa den från källan. Beroende på distributionen kanske du vill kompilera från källan, eftersom paketen tenderar att falla lite bakom.

# Installera på Debian och Ubuntu apt-get install memcached # Installera på Redhat och Fedora yum installera memcached # Installera på Mac OS X (med Homebrew) brew install memcached # Installera från källan få http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && gör test sudo make install

Du vill konfigurera Memcached för dina specifika behov, men för det här exemplet kommer vi bara att få det att gå med några grundläggande inställningar.

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

Vid den här tiden borde du vara igång med Memcached. Därefter tittar vi på hur man använder den med Rails, Django och Drupal. Det bör noteras att Memcached inte är begränsat till att användas inom ramen. Du kan använda Memcached med många programmeringsspråk genom en av de många tillgängliga klienterna.

Använda Memcached med Rails 3

Rails 3 har abstraherat caching systemet så att du kan ändra klienten till ditt hjärta önskan. I Ruby är den föredragna Memcached-klienten Dalli.

# Lägg till Dalli till din Gemfile-pärla 'dalli' # Aktivera Dalli i config / environments / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'

I utvecklingsläge slår du normalt inte Memcached, så starta Rails i produktionsläge med rails server -e produktion, eller lägg till ovanstående rader till din config / miljöer / development.rb.

Den enklaste användningen av cacheminnet är genom skriva/läsa metoder för att hämta data:

Rails.cache.write 'hej', 'world' # => true Rails.cache.read 'hej' # => "värld"

Det vanligaste mönstret för Rails caching använder hämta. Det kommer att försöka hämta nyckeln (i det här fallet, dyrt-query) och returnera värdet. Om nyckeln inte existerar kommer den att utföra det överförda blocket och lagra resultatet i nyckeln.

Rails.cache.fetch "dyrafråga" gör resultat = Transaktion. förenar (: payment_profile). förenar (: ordning). var (': skapade> order.created_at',: created => Time.now) slut # # ... mer kod som arbetar med resultat

I exemplet ovan är problemet cachertid. (Ett av de två hårda problemen i datavetenskap.) En avancerad, mycket robust lösning är att använda en del av resultaten i cachen själva, så att om resultaten ändras, kommer nyckeln automatiskt att gå ut automatiskt.

users = User.active users.each do | u | Rails.cache.fetch "profil / # u.id / # u.updated_at.to_i" do.profile änden

Här använder vi epoken av updated_at som en del av nyckeln, vilket ger oss inbyggd cache expiration. Så, om user.updated_at Tidändringar, vi kommer att få en cache miss på den befintliga profil cachen och skriva ut en ny. I det här fallet måste vi uppdatera användarens updated_at tid när deras profil är uppdaterad. Det är lika enkelt som att lägga till:

klassprofil < ActiveRecord::Base belongs_to :user, touch: true end

Nu har du självutgående profiler utan att behöva oroa dig för att hämta gammal data när användaren är uppdaterad. Det är nästan som magi!

Använda Memcached med Django

När du har installerat Memcached är det ganska enkelt att komma åt med Django. Först måste du installera ett klientbibliotek. Vi ska använda pylibmc.

# Installera pylibmc biblioteket pip install pylibmc # Konfigurera cacheservrar och bindande settings.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0,1: 11211 ',

Din app ska vara igång med Memcached nu. Liksom andra bibliotek, får du grundläggande getter och setter metoder för att komma åt cachen:

cache.set ('hej', 'world') cache.get ('hej') # => 'värld'

Du kan villkorligt ställa in en nyckel om den inte redan finns med Lägg till. Om nyckeln redan finns kommer det nya värdet att ignoreras.

cache.set ('hej', 'world') cache.add ('hej', 'mundus') cache.get ('hej') # => 'värld'

Från Python Decorator Library kan du skapa skapa a memoized dekoratorn att cache resultaten av ett metodsamtal.

importera samlingar importera funktools klass memoized (objekt): "Decorator. Caches en funktionens returvärde varje gång den heter. Om den senare heter med samma argument returneras den cachade värdet (ej omvärderad)." def __init __ (self func) : self.func = func self.cache =  def __call __ (self, * args): om inte isinstance (args, collections.Hashable): # uncacheable. en lista, till exempel. # bättre att inte cache än spränga. returnera self.func (* args) om args i self.cache: return self.cache [args] else: value = self.func (* args) self.cache [args] = värdeavkastningsvärde def __repr __ (self): " Returnera funktionens docstring. "Returnera self.func .__ doc__ def __get __ (själv, obj, objtype):" Support instansmetoder. "Returnera functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" Returnera nth fibonacci nummer. " om n in (0, 1): return n return (F-1) + Fibonacci (n-2) print fibonacci (12)

Decorators kan ge dig makt att ta det mesta av det tunga lyfter ut ur cache och cache-utgång. Var noga med att ta en titt på caching-exemplen i Decorator Library när du planerar ditt caching-system.

Använda Memcached med Drupal

Komma igång med Memcached i Drupal börjar med att installera PHP-förlängningen för Memcached.

# Installera Memcache-anknytningsinstallationsprogrammet memcache   'standard', '10 .1.1.2: 11212 '=>' standard '); ?>

Du måste starta om din ansökan om alla ändringar ska träda i kraft.

Som förväntat får du standard getter och setter metoder med Memcached modulen. En försiktighet är det cache_get returnerar cachelinjen, så du måste få tillgång till serialiserade data i den.

data; # => returnerar "world"?>

Och precis som det har du caching på plats i Drupal. Du kan bygga anpassade funktioner för att replikera funktionalitet som cache.fetch i skenor. Med en liten planering kan du ha en robust cache-lösning som kommer att ge din apps responsivitet till en ny nivå.

Och du är klar

Medan en bra caching-strategi tar tid att förfina, borde det inte hindra dig från att komma igång.

Genomförandet av ett cachningssystem kan vara ganska enkelt. Med rätt konfiguration kan en caching-lösning förlänga livslängden för din nuvarande arkitektur och göra din app snyggare än någonsin tidigare. Medan en bra caching-strategi tar tid att förfina, borde det inte hindra dig från att komma igång.

Som med något komplext system är övervakningen kritisk. Förstå hur cachen utnyttjas och var hotspots finns i dina data hjälper dig att förbättra din cache-prestanda. Memcached har ett kvalitetsstatysystem som hjälper dig att övervaka ditt cache-kluster. Du bör också använda ett verktyg, som New Relic, för att hålla koll på balansen mellan cacheminnet och databastiden. Som en extra bonus kan du få en gratis "Data Nerd" -tröja när du registrerar dig och distribuerar.