% Copyright (c) 2004-2010 Evolix <info@evolix.fr>
%  Permission is granted to copy, distribute and/or modify this document
%  under the terms of the GNU Free Documentation License, Version 1.2
%  or any later version published by the Free Software Foundation;
%  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
%  A copy of the license is included at http://www.gcolpart.com/howto/fdl.html

\chapter{Memcached}

Site officiel: \url{http://memcached.org/}

\section{Présentation}

Memcached est une base de données de type clé-valeur dont les informations sont
stockées uniquement en mémoire. Le but visé est de fournir un cache aux
applications (web ou non) afin de stocker des résultats de requêtes sur des API
ou base de données dont les appels sont couteux en ressources et temps
d'exécution.

Le cas d'utilisation typique est sa mise en place dans une infrastructure ayant un
serveur de base de donnée et N serveurs applicatifs. Memcached est fait pour
gérer les accès réseau concurrents, et peux être interrogé par chaque serveur
applicatif. Le premier serveur fait sa requête à la base de données ou API
distante, puis stocke le résultat dans Memcached. Les autres serveurs pourront
alors directement utiliser les données mises en cache dans Memcached, en
bénéficiant d'un accès beaucoup plus rapide.

Memcached supporte également la répartition de sa base sur plusieurs
serveurs mis en cluster.

Au contraire de Redis, Memcached ne dispose d'aucun moyen de sauvegarde
sur disque, il n'est donc adapté que pour stocker des données qui peuvent
facilement être regénérées par l'application ou hébergées par un service tiers
(plus lent).

Memcached est sorti dans sa première version en 2003. Il est écrit en C et
distribué sous la licence libre BSD.

\section{Installation}

Le paquet Debian memcached est disponible dans les dépôts officiels et fourni la
version 1.4.5:
\begin{verbatim}
# aptitude install memcached
\end{verbatim}

\section{Configuration}

La configuration de Memcached est triviale et se fait dans l'unique fichier
\texttt{/etc/memcached.conf}.

Voici un exemple de configuration:
\begin{verbatim}
-d
# Mode verbose (pour du debug)
logfile /var/log/memcached.log
# -v
# -vv
# Taille mémoire (en Mo)
-m 64
# Adresses d'écoute (à supprimer pour ouvrir de partout)
-l 127.0.0.1
-p 11211
-u nobody
# Nombre max de connexions
-c 2048
\end{verbatim}

Les options importantes sont notamment \texttt{-d} pour que Memcached soit lancé
en mode démon, \texttt{-m} qui indique la taille mémoire à allouer pour la base.
À noter la taille mémoire utilisée par Memcached pourra être légèrement
supérieure à la limite fixée dans la configuration.
On peut également fixer une limite maximum pour le nombre de connexions
concurrentes à la base via l'option \texttt{-c} (par défaut, limité à 1024). À
noter que Memcached est capable de gérer un nombre très élevé de connexions,
d'autant plus que chaque connexion ouverte consomme une quantité de mémoire
négligeable, il est donc conseillé de définir une limite assez haute.

Comme pour Redis, on peut également vouloir désactiver l'écoute sur un socket
réseau pour privilégier un socket unix, pour des raisons de sécurité. L'option à
utiliser pour cela est \texttt{-s}, suivi du chemin vers le socket unix.

\section{Utilisation}

Voici quelques commandes basiques pour interagir avec la base de données:
\begin{itemize}
  \item Connexion au serveur: on utilise \texttt{telnet}:
    \begin{verbatim}$ telnet localhost 11211\end{verbatim}
  \item Stocker une valeur:
    \begin{verbatim}set greeting 1 0 11
Hello world
STORED\end{verbatim}
    Les paramètres passés à \texttt{set} sont, dans l'ordre, la clé, un flag de
    contrôle, la durée de vie de l'entrée (elle sera supprimée au-delà), la
    taille de la valeur à stocker (en octets), et enfin la valeur (après un
    retour à la ligne).
  \item Récupérer une valeur:
    \begin{verbatim}get greeting
VALUE greeting 1 11
Hello world
END \end{verbatim}
  \item Statistiques sur les entrées stockées:
    \begin{verbatim}stats items
STAT items:1:number 1
STAT items:1:age 1397
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
END\end{verbatim}
\end{itemize}

