Utiliser Memcache

Cette page explique comment configurer et surveiller le service Memcache pour votre application à l'aide de la console Google Cloud. Elle montre également comment utiliser l'API Python Memcache d'App Engine pour mettre en cache des valeurs et les récupérer, et comment utiliser la fonctionnalité "compare and set" pour gérer les requêtes d'écriture simultanées dans la même clé Memcache. Pour en savoir plus sur Memcache, consultez la page Présentation de Memcache.

Configurer Memcache

  1. Accédez à la page "Memcache" de Google Cloud Console.
    Accéder à la page "Memcache"
  2. Sélectionnez le niveau de service Memcache que vous souhaitez utiliser.

    • Partagé : (valeur par défaut) niveau de service gratuit qui attribue la capacité de cache de la manière la plus optimale possible.
    • Dédié : niveau de service facturé en Go/heure de taille de cache utilisé. Il fournit une capacité de cache fixe qui est attribuée exclusivement à votre application.

    Pour en savoir plus sur les classes de service disponibles, consultez la page Présentation de Memcache.

Mettre en cache des valeurs et les récupérer

Mettre en cache une valeur

Utilisez add() pour ajouter la valeur d'une clé si, et seulement si, elle n'existe pas encore. Vous pouvez renseigner un délai d'expiration facultatif :

memcache.add(key="[KEY]", value="[VALUE]", time=[EXPIRATION_TIME])

Par exemple, pour ajouter la valeur raining à la clé weather_USA_98105 avec un délai d'expiration d'une heure à partir du moment où la valeur est écrite :

memcache.add(key="weather_USA_98105", value="raining", time=3600)

Pour en savoir plus sur add() et les autres méthodes de définition de valeurs, consultez la documentation de l'API Python de Memcache.

Pour voir d'autres exemples de mise en cache de valeurs, consultez la section Exemples Memcache.

Rechercher des valeurs mises en cache

Utilisez la fonction get() pour rechercher la valeur d'une clé unique :

memcache.get(key="[KEY]")

Par exemple, pour obtenir la valeur de la clé weather_USA_98105 :

memcache.get(key="weather_USA_98105")

Pour en savoir plus sur get() et les autres méthodes permettant de rechercher des valeurs, consultez la documentation de l'API Python de Memcache.

Surveiller Memcache dans Google Cloud Console

  1. Accédez à la page "Memcache" de Google Cloud Console.
    Accéder à la page "Memcache"
  2. Consultez les rapports ci-dessous :
    • Niveau de service Memcache : indique si l'application utilise le niveau de service partagé ou dédié. Si vous êtes propriétaire du projet, vous pouvez basculer de l'un à l'autre. En savoir plus sur les niveaux de service
    • Taux d'accès : affiche le pourcentage de réponses à des requêtes de données diffusé à partir du cache, ainsi que le nombre brut de réponses diffusées à partir du cache.
    • Éléments en cache.
    • Âge du plus ancien élément : âge de l'élément en cache le plus ancien. Notez que l'âge d'un élément est réinitialisé chaque fois que ce dernier est utilisé, qu'il soit lu ou écrit.
    • Taille totale du cache.
  3. Vous pouvez effectuer l'une des actions suivantes :

    • Nouvelle clé : ajoute une clé au cache.
    • Trouver une clé : récupère une clé existante.
    • Vider la mémoire cache : supprime toutes les paires clé/valeur du cache.
  4. (Service Memcache dédié uniquement) Parcourez la liste des Clés fréquemment utilisées.

    • Les clés de cette liste reçoivent plus de 100 requêtes par seconde (RPS) dans Memcache.
    • Cette liste peut comporter jusqu'à 100 clés, triées par ordre décroissant en fonction du nombre de RPS reçues.

Traiter les écritures simultanées

Pour utiliser la fonctionnalité "compare and set" afin de gérer plusieurs requêtes de mise à jour simultanées vers la même clé Memcache, procédez de la manière suivante :

  1. Instanciez un objet Client Memcache.
  2. Utilisez une boucle de nouvelle tentative (retry), de préférence en définissant une limite sur le nombre de tentatives et un intervalle exponentiel entre les tentatives.
    1. Dans la boucle de nouvelle tentative, obtenez la clé à l'aide de gets() ou get_multi(), en ayant défini le paramètre for_cas sur la valeur True.
    2. Dans la boucle de nouvelle tentative, mettez à jour la valeur de la clé à l'aide de cas() ou cas_multi().

L'extrait de code suivant montre comment utiliser la fonctionnalité "compare and set" :

def bump_counter(key):
   client = memcache.Client()
   while True: # Retry loop
     counter = client.gets(key)
     if counter is None: raise KeyError('Uninitialized counter')
     if client.cas(key, counter+1):
        break

La boucle de nouvelle tentative est nécessaire, car sans cette boucle, le code n'évite pas les conditions de concurrence, il se contente de les détecter. Le service Memcache garantit que, lorsqu'il est utilisé suivant le modèle présenté ici (c'est-à-dire en utilisant gets() et cas()), si deux instances clientes différentes (ou plus) se retrouvent en condition de concurrence, seule la première exécution de l'opération cas() réussit (renvoie la valeur True), tandis que la seconde (et toutes les suivantes) échoue (renvoie la valeur False).

Il est recommandé de raffiner cet exemple de code en limitant le nombre de tentatives, afin d'éviter une boucle infinie dans le scénario de pire cas où le même compteur est particulièrement disputé. Ce type de conflit peut par exemple survenir s'il y a davantage de requêtes essayant de mettre à jour le compteur que le service Memcache ne peut traiter en temps réel.

Pour en savoir plus sur la fonctionnalité "compare and set", consultez la page Présentation de Memcache.

Étapes suivantes