Una de las maneras más fáciles de mejorar el rendimiento de su aplicación es poner una solución de almacenamiento en caché frente a su base de datos. En este tutorial, te mostraré cómo usar Memcached con Rails, Django o Drupal.
Memcached es una excelente opción para este problema, dado su historial sólido, instalación simple y comunidad activa. Es utilizado por compañías grandes y pequeñas, e incluye gigantes, como Facebook, YouTube y Twitter. El sitio Memcached, en sí mismo, hace un buen trabajo al describir a Memcached como un "sistema de almacenamiento en caché de objetos de memoria distribuida, de código abierto, de alto rendimiento y de código abierto, de naturaleza genérica, pero diseñado para acelerar las aplicaciones web dinámicas al aliviar la carga de la base de datos. "
En general, las llamadas a bases de datos son lentas..
En general, las llamadas a la base de datos son lentas, ya que la consulta requiere recursos de la CPU para procesar y los datos (generalmente) se recuperan del disco. Por otro lado, un caché en memoria, como Memcached, toma muy pocos recursos de CPU y los datos se recuperan de la memoria en lugar del disco. La CPU aligerada es un efecto del diseño de Memcached; No es cuestionable, como una base de datos SQL. En su lugar, utiliza pares clave-valor para recuperar todos los datos y no puede recuperar datos de Memcached sin conocer primero su clave..
Memcached almacena los pares clave-valor completamente en la memoria. Esto hace que la recuperación sea extremadamente rápida, pero también hace que los datos sean efímeros. En el caso de un bloqueo o reinicio, la memoria se borra y todos los pares clave-valor deben reconstruirse. No hay sistemas integrados de alta disponibilidad y / o conmutación por error en Memcached. Sin embargo, es un sistema distribuido, por lo que los datos se almacenan en varios nodos. Si se pierde un nodo, los nodos restantes continúan las solicitudes de servicio y completan el nodo faltante..
Instalar Memcached es un proceso bastante simple. Se puede hacer a través de un gestor de paquetes o compilando desde la fuente. Dependiendo de su distribución, es posible que desee compilar desde la fuente, ya que los paquetes tienden a quedarse un poco atrás..
# Instalar en Debian y Ubuntu apt-get install memcached # Instalar en Redhat y Fedora yum install memcached # Instalar en Mac OS X (con Homebrew) brew install memcached # Instalar desde la fuente obtener http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && make prueba sudo make install
Querrá configurar Memcached para sus necesidades específicas, pero, para este ejemplo, simplemente lo haremos funcionar con algunas configuraciones básicas.
memcached -m 512 -c 1024 -p 11211 -d
En este punto, debe estar listo y funcionando con Memcached. A continuación, veremos cómo usarlo con Rails, Django y Drupal. Se debe tener en cuenta que Memcached no se limita a ser utilizado dentro de un marco. Puede usar Memcached con muchos lenguajes de programación a través de uno de los muchos clientes disponibles.
Rails 3 ha abstraído el sistema de almacenamiento en caché para que pueda cambiar al cliente según el deseo de su corazón. En Ruby, el cliente Memcached preferido es Dalli..
# Agregue Dalli a su gema Gemfile 'dalli' # Habilite Dalli en config / environment / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'
En el modo de desarrollo, normalmente no accederá a Memcached, así que inicie Rails en modo de producción con servidor de rieles -e producción
, o agregue las líneas anteriores a su config / environment / development.rb
.
El uso más simple de la memoria caché es a través de escribir
/leer
Métodos para recuperar datos:
Rails.cache.write 'hello', 'world' # => true Rails.cache.read 'hello' # => "world"
El patrón más común para el almacenamiento en caché de Rails está usando ha podido recuperar
. Intentará recuperar la clave (en este caso, consulta costosa
) y devuelve el valor. Si la clave no existe, ejecutará el bloque pasado y almacenará el resultado en la clave..
Rails.cache.fetch 'costoso-consulta' do resultados = Transacción. se une (: payment_profile). Uniones (: orden). where (': created> orders.created_at',: created => Time.now) end # ... más código trabajando con resultados
En el ejemplo anterior, el problema es la caducidad de la caché. (Uno de los dos problemas difíciles en informática). Una solución avanzada y muy robusta es utilizar parte de los resultados en la clave de caché, de modo que si los resultados cambian, la clave caducará automáticamente..
users = User.active users.each do | u | Rails.cache.fetch "profile / # u.id / # u.updated_at.to_i" do u.profile end end
Aquí, estamos usando la época de updated_at
como parte de la clave, lo que nos da la caducidad de caché integrada. Entonces, si el user.updated_at
Con el tiempo, obtendremos una falta de caché en el caché de perfil preexistente y escribiremos uno nuevo. En este caso, tendremos que actualizar el usuario. updated_at
Hora en que se actualiza su perfil. Eso es tan simple como agregar:
Perfil de clase < ActiveRecord::Base belongs_to :user, touch: true end
Ahora, tiene perfiles autoexpirantes sin preocuparse por recuperar datos antiguos cuando el usuario está actualizado. Es casi como magia!
Una vez que tienes instalado Memcached, es bastante sencillo acceder con Django. Primero, necesitarás instalar una biblioteca cliente. Nosotros usaremos pylibmc
.
# Instalar la biblioteca pylibmc pip instalar pylibmc # Configurar servidores de caché y configuraciones de enlace.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0.1: 11211 ',
Tu aplicación debería estar funcionando con Memcached ahora. Al igual que otras bibliotecas, obtendrá métodos básicos de obtención y configuración para acceder al caché:
cache.set ('hello', 'world') cache.get ('hello') # => 'world'
Puede establecer una clave de forma condicional si no existe con añadir
. Si la clave ya existe, el nuevo valor será ignorado.
cache.set ('hello', 'world') cache.add ('hello', 'mundus') cache.get ('hello') # => 'world'
Desde la biblioteca de Python Decorator, puede crear crear un memorizado
Decorador para almacenar en caché los resultados de una llamada a un método..
importar colecciones importar functools class memoized (objeto): "Decorador. Cava el valor de retorno de una función cada vez que se llama. Si se llama más tarde con los mismos argumentos, se devuelve el valor almacenado en caché (no reevaluado)" def __init __ (self, func) : self.func = func self.cache = def __call __ (self, * args): si no es isinstance (args, collections.Hashable): # uncacheable. una lista, por ejemplo. # mejor no caché que explotar. devuelve self.func (* args) si args en self.cache: return self.cache [args] else: value = selffunc (* args) self.cache [args] = value return value def __repr __ (self): " Devuelva la cadena de documentación de la función. "Return selffunc .__ doc__ def __get __ (self, obj, objtype):" Soporte de métodos de instancia. "Return functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" Return the nth fibonacci numero ". si n en (0, 1): devolver n devolver fibonacci (n-1) + fibonacci (n-2) imprimir fibonacci (12)
Los decoradores pueden darle el poder de eliminar la mayor parte del trabajo pesado del almacenamiento en caché y la caducidad de la caché. Asegúrese de echar un vistazo a los ejemplos de almacenamiento en caché en la Biblioteca de Decorator mientras planifica su sistema de almacenamiento en caché.
Comenzar con Memcached en Drupal comienza con la instalación de la extensión PHP para Memcached.
# Instalar la extensión de Memcached. 'predeterminado', '10 .1.1.2: 11212 '=>' predeterminado '); ?>
Tendrá que reiniciar su aplicación para que todos los cambios surtan efecto..
Como era de esperar, obtendrá los métodos estándar de obtención y configuración con el módulo Memcached. Una advertencia es que cache_get
devuelve la fila de caché, por lo que deberá acceder a los datos serializados que contiene..
datos; # => devuelve 'mundo'?>
Y así, tienes caché en Drupal. Puede crear funciones personalizadas para replicar funcionalidades como cache.fetch
en rieles. Con un poco de planificación, puede tener una solución robusta de almacenamiento en caché que llevará la capacidad de respuesta de su aplicación a un nuevo nivel.
Si bien una buena estrategia de almacenamiento en caché toma tiempo para refinarla, no debería impedirle comenzar.
Implementar un sistema de almacenamiento en caché puede ser bastante sencillo. Con la configuración correcta, una solución de almacenamiento en caché puede extender la vida útil de su arquitectura actual y hacer que su aplicación se sienta más ágil que nunca. Si bien una buena estrategia de almacenamiento en caché toma tiempo para refinarla, no debería impedirle comenzar.
Como con cualquier sistema complejo, el monitoreo es crítico. Comprender cómo se utiliza su caché y dónde se encuentran los puntos de acceso en sus datos lo ayudará a mejorar el rendimiento de su caché. Memcached tiene un sistema de estadísticas de calidad para ayudarte a monitorear tu clúster de caché. También debe utilizar una herramienta, como New Relic, para controlar el equilibrio entre el tiempo de la memoria caché y la base de datos. Como bono adicional, puedes obtener una camiseta gratis de "Data Nerd" cuando te registres e implementes.