Migliora le prestazioni della tua app con Memcached

Uno dei modi più semplici per migliorare le prestazioni dell'applicazione è mettere una soluzione di memorizzazione nella cache di fronte al tuo database. In questo tutorial, ti mostrerò come usare Memcached con Rails, Django o Drupal.

Memcached è una scelta eccellente per questo problema, data la sua solida storia, l'installazione semplice e la comunità attiva. Viene utilizzato da aziende grandi e piccole e include giganti come Facebook, YouTube e Twitter. Il sito Memcached, di per sé, fa un buon lavoro nel descrivere Memcached come un "Free & open source, ad alte prestazioni, sistema di memoria cache distribuito, di natura generica, ma destinato all'uso nell'accelerazione di applicazioni web dinamiche alleviando il carico del database. "

In generale, le chiamate al database sono lente.

In generale, le chiamate al database sono lente, poiché la query richiede l'elaborazione delle risorse della CPU e i dati vengono (di solito) recuperati dal disco. D'altra parte, una cache in memoria, come Memcached, richiede pochissime risorse della CPU e i dati vengono recuperati dalla memoria anziché dal disco. La CPU alleggerita è un effetto del design di Memcached; non è interrogabile, come un database SQL. Invece, utilizza coppie chiave-valore per recuperare tutti i dati e non è possibile recuperare i dati da Memcached senza prima conoscerne la chiave.

Memcached memorizza le coppie chiave-valore interamente in memoria. Questo rende il recupero estremamente veloce, ma rende anche i dati effimeri. In caso di arresto anomalo o riavvio, la memoria viene cancellata e tutte le coppie chiave-valore devono essere ricostruite. Non ci sono sistemi integrati ad alta disponibilità e / o failover all'interno di Memcached. Tuttavia, è un sistema distribuito, quindi i dati vengono archiviati su più nodi. Se un nodo viene perso, i nodi rimanenti continuano a servire e riempire il nodo mancante.

Installazione di Memcached

Installare Memcached è un processo abbastanza semplice. Può essere fatto tramite un gestore di pacchetti o compilandolo dal sorgente. A seconda della tua distribuzione, potresti voler compilare dal sorgente, dato che i pacchetti tendono a cadere un po 'indietro.

# Installa su Debian e Ubuntu apt-get install memcached # Installa su Redhat e Fedora yum installa memcached # Installa su Mac OS X (con Homebrew) brew installa memcached # Installa da Source ottieni http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && make test sudo make install

Dovrai configurare Memcached per le tue esigenze specifiche, ma, per questo esempio, lo eseguiremo semplicemente con alcune impostazioni di base.

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

A questo punto, dovresti essere attivo e funzionante con Memcached. Successivamente, vedremo come utilizzarlo con Rails, Django e Drupal. Va notato che Memcached non è limitato all'utilizzo all'interno di un framework. Puoi usare Memcached con molti linguaggi di programmazione attraverso uno dei tanti client disponibili.

Uso di Memcached con Rails 3

Rails 3 ha astratto il sistema di cache in modo che tu possa cambiare il cliente in base al desiderio del tuo cuore. In Ruby, il client Memcached preferito è Dalli.

# Aggiungi Dalli al tuo Gemfile gem 'dalli' # Abilita Dalli in config / environments / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'

In modalità di sviluppo, normalmente non si preme Memcached, quindi avviare Rails in modalità di produzione con rails server -e produzione, o aggiungi le linee precedenti al tuo config / ambienti / development.rb.

Il più semplice uso della cache è attraverso Scrivi/leggere metodi per recuperare i dati:

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

Si sta utilizzando il modello più comune per il caching di Rails andare a prendere. Tenterà di recuperare la chiave (in questo caso, costoso-query) e restituire il valore. Se la chiave non esiste, eseguirà il blocco passato e memorizzerà il risultato nella chiave.

Rails.cache.fetch 'costosa query' fare risultati = Transazione. unisce (: payment_profile). unisce (: ordine). dove (': created> orders.created_at',: created => Time.now) end # ... altro codice che lavora con i risultati

Nell'esempio sopra, il problema è la scadenza della cache. (Uno dei due problemi più difficili in informatica.) Una soluzione avanzata e molto solida consiste nell'usare parte dei risultati nella chiave di cache stessa, in modo che se i risultati cambiano, la chiave viene automaticamente espulsa.

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

Qui, stiamo usando l'epoca di updated_at come parte della chiave, che ci dà la scadenza cache incorporata. Quindi, se il user.updated_at cambi di orario, avremo un errore di cache sulla cache del profilo preesistente e ne scriverò uno nuovo. In questo caso, dovremo aggiornare l'utente updated_at momento in cui il loro profilo viene aggiornato. È semplice come aggiungere:

profilo di classe < ActiveRecord::Base belongs_to :user, touch: true end

Ora, hai i profili che si auto-scadono senza preoccuparsi di recuperare i vecchi dati quando l'utente viene aggiornato. È quasi come una magia!

Usando Memcached con Django

Una volta installato Memcached, è abbastanza semplice accedere a Django. Innanzitutto, è necessario installare una libreria client. Useremo pylibmc.

# Installa pylibmc library pip install pylibmc # Configura server cache e binding settings.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0.1: 11211 ',

La tua app dovrebbe essere attiva e funzionante con Memcached ora. Come altre librerie, avrai i metodi getter e setter di base per accedere alla cache:

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

È possibile impostare una chiave condizionatamente se non esiste già con Inserisci. Se la chiave esiste già, il nuovo valore verrà ignorato.

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

Dalla libreria di Python Decorator, è possibile creare create a memoized decoratore per memorizzare i risultati di una chiamata al metodo.

import collezioni import functools class memoized (object): "Decorator Memorizza in cache il valore di ritorno di una funzione ogni volta che viene chiamato. Se chiamato in seguito con gli stessi argomenti, viene restituito il valore memorizzato nella cache (non rivalutato)." def __init __ (self, func) : self.func = func self.cache =  def __call __ (self, * args): se non isinstance (args, collections.Hashable): # uncacheable. una lista, per esempio. # meglio non cache che esplodere. return self.func (* args) se args in self.cache: return self.cache [args] else: value = self.func (* args) self.cache [args] = valore valore restituito def __repr __ (self): " Restituisce docstring della funzione. "Return self.func .__ doc__ def __get __ (self, obj, objtype):" Supporta i metodi di istanza. "Return functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" Restituisci n ° numero di fibonacci. " se n in (0, 1): return n return fibonacci (n-1) + fibonacci (n-2) print fibonacci (12)

I decoratori possono darti il ​​potere di eliminare gran parte della cache e della scadenza della cache. Assicurati di dare un'occhiata agli esempi di memorizzazione nella cache nella Libreria Decorator mentre stai pianificando il tuo sistema di memorizzazione nella cache.

Usando Memcached con Drupal

Iniziare con Memcached in Drupal inizia con l'installazione dell'estensione PHP per Memcached.

# Installa l'estensione Memcached pecl install memcache   'default', '10 .1.1.2: 11212 '=>' default '); ?>

Dovrai riavviare la tua applicazione affinché tutte le modifiche abbiano effetto.

Come previsto, otterrete i metodi getter e setter standard con il modulo Memcached. Un avvertimento è questo cache_get restituisce la riga della cache, quindi è necessario accedere ai dati serializzati al suo interno.

dati; # => restituisce 'mondo'?>

E proprio così, hai attivato il caching in Drupal. È possibile creare funzioni personalizzate per replicare funzionalità come cache.fetch in Rails. Con un po 'di pianificazione, puoi avere una soluzione di caching robusta che porterà la reattività della tua app ad un nuovo livello.

E hai finito

Mentre una buona strategia di memorizzazione nella cache richiede tempo per perfezionare, non dovrebbe impedirti di iniziare.

L'implementazione di un sistema di memorizzazione nella cache può essere abbastanza semplice. Con la giusta configurazione, una soluzione di caching può estendere la vita della tua attuale architettura e rendere la tua app più reattiva di quanto abbia mai fatto prima. Mentre una buona strategia di memorizzazione nella cache richiede tempo per perfezionare, non dovrebbe impedirti di iniziare.

Come con qualsiasi sistema complesso, il monitoraggio è fondamentale. Capire come viene utilizzata la cache e dove sono presenti gli hotspot nei tuoi dati ti aiuterà a migliorare le prestazioni della cache. Memcached ha un sistema di statistiche di qualità per aiutarti a monitorare il tuo cluster di cache. Dovresti anche usare uno strumento come New Relic per tenere d'occhio l'equilibrio tra la cache e il tempo del database. Come bonus aggiuntivo, puoi ottenere una maglietta gratuita "Data Nerd" quando ti iscrivi e fai il deploy.