L'un des moyens les plus simples d'améliorer les performances de votre application consiste à placer une solution de mise en cache devant votre base de données. Dans ce tutoriel, je vais vous montrer comment utiliser Memcached avec Rails, Django ou Drupal.
Memcached est un excellent choix pour ce problème, compte tenu de son histoire solide, de son installation simple et de sa communauté active. Il est utilisé par les grandes et les petites entreprises et inclut des géants tels que Facebook, YouTube et Twitter. Le site Memcached, en tant que tel, décrit bien Memcached comme un système de mise en cache d’objets de mémoire distribués haute performance, libre et gratuit, de nature générique, mais destiné à accélérer les applications Web dynamiques en allégeant la charge de la base de données. "
En général, les appels de base de données sont lents.
En général, les appels de base de données sont lents, car la requête prend des ressources de la CPU à traiter et les données sont (généralement) récupérées à partir du disque. D'autre part, un cache en mémoire, comme Memcached, utilise très peu de ressources de la CPU et les données sont extraites de la mémoire plutôt que du disque. Le processeur allégé est un effet du design de Memcached; ce n'est pas interrogeable, comme une base de données SQL. Au lieu de cela, il utilise des paires clé-valeur pour extraire toutes les données et vous ne pouvez pas extraire des données de Memcached sans connaître au préalable sa clé..
Memcached stocke les paires clé-valeur entièrement en mémoire. Cela rend l'extraction extrêmement rapide, mais rend également les données éphémères. En cas de blocage ou de redémarrage, la mémoire est effacée et toutes les paires clé-valeur doivent être reconstruites. Il n'y a pas de systèmes de haute disponibilité et / ou de basculement intégrés dans Memcached. Cependant, il s'agit d'un système distribué, de sorte que les données sont stockées sur plusieurs nœuds. Si un nœud est perdu, les nœuds restants continuent à servir les demandes et à remplir le nœud manquant..
L'installation de Memcached est un processus assez simple. Cela peut être fait par un gestionnaire de paquets ou en le compilant à partir des sources. Selon votre distribution, vous voudrez peut-être compiler à partir des sources, car les paquets ont tendance à prendre un peu de retard..
# Installer sur Debian et Ubuntu: apt-get install memcached # Installer sur Redhat et Fedora yum install install memcached # Installer sur Mac OS X (avec Homebrew) brassé installer memcached # Installer à partir de la source obtenir http://memcached.org/latest tar -zxvf memcached-1.xxtar.gz cd memcached-1.xx ./configure make && test test sudo make install
Vous voudrez configurer Memcached pour vos besoins spécifiques, mais pour cet exemple, nous allons simplement le faire fonctionner avec quelques paramètres de base..
memcached -m 512 -c 1024 -p 11211 -d
À ce stade, vous devriez être opérationnel avec Memcached. Nous verrons ensuite comment l’utiliser avec Rails, Django et Drupal. Il convient de noter que Memcached n'est pas limité à être utilisé dans un cadre. Vous pouvez utiliser Memcached avec de nombreux langages de programmation via l’un des nombreux clients disponibles..
Rails 3 a résumé le système de mise en cache afin que vous puissiez modifier le client à votre guise. En Ruby, le client préféré de Memcached est Dalli..
# Ajoutez Dalli à votre gemfile 'dalli' # Activez Dalli dans config / environnements / production.rb: config.perform_caching = true config.cache_store =: dalli_store, 'localhost: 11211'
En mode développement, vous n’aurez normalement pas recours à Memcached. Par conséquent, démarrez Rails en mode production avec rails serveur -e production
, ou ajoutez les lignes ci-dessus à votre config / environnements / développement.rb
.
L’utilisation la plus simple du cache se fait par écrire
/lis
méthodes pour récupérer des données:
Rails.cache.write 'bonjour', 'monde' # => vrai Rails.cache.read 'bonjour' # => "monde"
Le modèle le plus courant pour la mise en cache de Rails utilise aller chercher
. Il tentera de récupérer la clé (dans ce cas,, requête coûteuse
) et retourne la valeur. Si la clé n'existe pas, il exécutera le bloc passé et enregistrera le résultat dans la clé..
Rails.cache.fetch 'Cher-requête' faire des résultats = Transaction. rejoint (: payment_profile). rejoint (: commande). where (': created> orders.created_at',: created => Time.now) end #… plus de code travaillant avec des résultats
Dans l'exemple ci-dessus, le problème est l'expiration du cache. (L'un des deux problèmes majeurs de l'informatique.) Une solution avancée très robuste consiste à utiliser une partie des résultats dans la clé de cache elle-même, de sorte que si les résultats changent, la clé expire automatiquement..
users = User.active users.each faire | u | Rails.cache.fetch "profile / # u.id / # u.updated_at.to_i" do u.profile end end
Ici, nous utilisons l'époque de updated_at
dans le cadre de la clé, ce qui nous donne une expiration de cache intégrée. Donc, si le user.updated_at
Les changements de temps, nous allons obtenir un cache sur le cache de profil préexistant et en écrire un nouveau. Dans ce cas, nous devrons mettre à jour les informations de l'utilisateur. updated_at
moment où leur profil est mis à jour. C'est aussi simple que d'ajouter:
Profil de classe < ActiveRecord::Base belongs_to :user, touch: true end
Désormais, vous avez des profils expirant de vous-même sans vous soucier de récupérer les anciennes données lorsque l'utilisateur est mis à jour. C'est presque comme par magie!
Une fois que vous avez installé Memcached, il est assez simple d’y accéder avec Django. Tout d'abord, vous devez installer une bibliothèque client. Nous allons utiliser pylibmc
.
# Installer le pip de la bibliothèque pylibmc installer pylibmc # Configurer les serveurs de cache et la liaison settings.py CACHES = 'default': 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0. 0,1: 11211 ',
Votre application devrait maintenant être opérationnelle avec Memcached. Comme d'autres bibliothèques, vous aurez accès aux méthodes de base de lecture et de définition pour accéder au cache:
cache.set ('bonjour', 'monde') cache.get ('bonjour') # => 'monde'
Vous pouvez définir conditionnellement une clé si elle n’existe pas déjà avec ajouter
. Si la clé existe déjà, la nouvelle valeur sera ignorée.
cache.set ('bonjour', 'monde') cache.add ('bonjour', 'mundus') cache.get ('bonjour') # => 'monde'
À partir de la bibliothèque Python Decorator, vous pouvez créer un mémo
décorateur pour mettre en cache les résultats d'un appel de méthode.
import collections collections import functools class memoized (object): "Decorator. Met en cache la valeur renvoyée par une fonction chaque fois qu'elle est appelée. Si elle est appelée ultérieurement avec les mêmes arguments, la valeur en cache est renvoyée (non réévaluée)." def __init __ (self, func) : self.func = func self.cache = def __call __ (self, * args): sinon isinstance (args, collections.Hashable): # uncacheable. une liste, par exemple. # Mieux vaut ne pas cacher que sauter. return self.func (* args) si args dans self.cache: return self.cache [args] else: valeur = self.func (* args) self.cache [args] = valeur valeur de retour def __repr __ (self): " Renvoie la docstring de la fonction. "Return self.func .__ doc__ def __get __ (self, obj, type d'objet):" Méthodes d'instance de support. "Return functools.partial (self .__ call__, obj) @memoized def fibonacci (n):" Renvoie le numéro de fibonacci ". si n dans (0, 1): retourne n retour fibonacci (n-1) + fibonacci (n-2) empreinte fibonacci (12)
Les décorateurs peuvent vous donner le pouvoir d’éliminer le plus possible la mise en cache et l’expiration du cache. Veillez à consulter les exemples de mise en cache de la bibliothèque de Decorator lors de la planification de votre système de mise en cache..
Commencer à utiliser Memcached dans Drupal commence par installer l'extension PHP pour Memcached.
# Installer l'extension Memcached pecl installer memcache 'default', '10 .1.1.2: 11212 '=>' default '); ?>
Vous devrez redémarrer votre application pour que toutes les modifications prennent effet..
Comme prévu, vous obtiendrez les méthodes standard de lecture et de définition avec le module Memcached. Une mise en garde est que cache_get
renvoie la ligne de cache, vous aurez donc besoin d'accéder aux données sérialisées qu'il contient.
Les données; # => renvoie 'monde'?>
Et juste comme ça, vous avez la mise en cache en place dans Drupal. Vous pouvez créer des fonctions personnalisées pour répliquer des fonctionnalités telles que cache.fetch
dans les rails. Avec un peu de planification, vous pouvez avoir une solution de mise en cache robuste qui portera la réactivité de votre application à un niveau supérieur..
Bien qu’une bonne stratégie de mise en cache prenne du temps à s’affiner, elle ne devrait pas vous empêcher de commencer..
L'implémentation d'un système de mise en cache peut être assez simple. Avec la bonne configuration, une solution de mise en cache peut prolonger la durée de vie de votre architecture actuelle et donner à votre application une sensation plus vivante qu'auparavant. Bien qu’une bonne stratégie de mise en cache prenne du temps à s’affiner, elle ne devrait pas vous empêcher de commencer..
Comme pour tout système complexe, la surveillance est essentielle. Comprendre comment votre cache est utilisé et où se trouvent les points chauds dans vos données vous aidera à améliorer les performances de votre cache. Memcached dispose d'un système de statistiques de qualité pour vous aider à surveiller votre cluster de cache. Vous devez également utiliser un outil, comme New Relic, pour garder un œil sur l’équilibre entre le temps de cache et le temps de base de données. En prime, vous pouvez obtenir un tshirt 'Data Nerd' gratuit lorsque vous vous inscrivez et déployez.