Usa Memcache

En esta página, se describe cómo configurar y supervisar el servicio de Memcache para la aplicación con Google Cloud Console. También se describe cómo usar la API de Python de Memcache en App Engine a fin de establecer y recuperar valores almacenados en caché y usar la función de comparación y configuración para controlar solicitudes de escritura simultáneas a la misma clave de Memcache. Si quieres aprender más sobre Memcache, consulta Descripción general de Memcache.

Cómo configurar Memcache

  1. Ve a la página de Memcache en Google Cloud Console.
    Ir a la página de Memcache
  2. Selecciona el nivel de servicio de Memcache que desees usar:

    • Compartido (predeterminado): es gratuito y proporciona capacidades de caché sobre la base del "mejor esfuerzo".
    • Dedicado: se factura por GB por hora de tamaño de caché y proporciona una capacidad de caché fija asignada exclusivamente a tu aplicación.

    Obtén más información sobre las clases de servicio disponibles en Descripción general de Memcache.

Cómo almacenar valores en caché y recuperarlos

Almacena un valor en caché

Usa add() para agregar el valor de una clave si, y solo si, este no existe, con una hora de vencimiento opcional:

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

Por ejemplo, para agregar el valor raining a la clave weather_USA_98105 con una duración de una hora a partir del momento de escritura, ejecuta el siguiente código:

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

Obtén más información sobre add() y otros métodos para configurar valores en la documentación de la API de Python de Memcache.

Consulta otros ejemplos de almacenamiento de valores en caché en Ejemplos de Memcache.

Busca valores almacenados en caché

Usa get() para buscar el valor de una sola clave:

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

Por ejemplo, para obtener el valor de la clave weather_USA_98105, haz lo siguiente:

memcache.get(key="weather_USA_98105")

Obtén más información sobre get() y otros métodos para buscar valores en la documentación de la API de Python de Memcache.

Supervisa Memcache en Google Cloud Console

  1. Ve a la página de Memcache en Google Cloud Console.
    Ir a la página de Memcache
  2. Consulta los siguientes informes:
    • Nivel de servicio de Memcache: Muestra si tu aplicación usa el nivel de servicio Compartido o Dedicado. Si eres propietario del proyecto, puedes alternar entre ambos. Obtén más información sobre los niveles de servicio.
    • Proporción de aciertos: Muestra el porcentaje de solicitudes de datos que se entregaron desde la caché y la cantidad de solicitudes de datos sin procesar que se entregaron desde la caché.
    • Elementos en la caché.
    • Edad del elemento más antiguo: Edad del elemento almacenado en caché más antiguo. Ten en cuenta que la edad de un elemento se restablece cada vez que se usa, ya sea en operaciones de lectura o de escritura.
    • Tamaño total de caché
  3. Puedes realizar cualquiera de las siguientes acciones:

    • Clave nueva: agrégale una clave a la caché.
    • Encontrar una clave: recupera una clave existente.
    • Limpiar caché: quita todos los pares clave-valor de la caché.
  4. (Solo para Memcache dedicada) Consulta la lista de claves populares.

    • Las "claves populares" son claves que reciben más de 100 consultas por segundo (QPS) en Memcache.
    • La lista incluye hasta 100 claves populares ordenadas de mayor a menor cantidad de QPS.

Cómo administrar escrituras simultáneas

Para usar la función de comparación y configuración a fin de controlar escrituras de varias solicitudes a la misma clave de Memcache, haz lo siguiente:

  1. Crea una instancia de un objeto Client de Memcache.
  2. Usa un bucle de reintentos (es preferible que posea un límite de reintentos y una retirada exponencial)
    1. Dentro del bucle de reintentos, obtén la clave mediante gets() o get_multi() con el parámetro for_cas configurado como True.
    2. Dentro del bucle de reintentos, actualiza el valor de la clave mediante cas() o cas_multi().

En el siguiente fragmento de código, se muestra una forma de usar la función de comparación y configuración:

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

El ciclo de reintentos es necesario porque sin él el código mencionado no evita las condiciones de carrera, solo las detecta. El servicio de Memcache garantiza que cuando se usa en el patrón que se muestra aquí (es decir, mediante gets() y cas()), si hay dos (o más) instancias cliente diferentes involucradas en una condición de carrera, solo la primera en ejecutar la operación cas() tiene éxito (muestra True), mientras que la segunda (y las posteriores) falla (muestra False).

Otra mejora que podrías agregar en este código de muestra consiste en establecer un límite de reintentos para evitar ciclos infinitos en los peores casos posibles donde haya una gran disputa por el mismo contador. Una situación en la que podría haber tal disputa se da si las solicitudes que intentan actualizar el contador son más de las que el servicio de Memcache puede procesar en tiempo real.

Obtén más información sobre la función de comparación y configuración en la Descripción general de Memcache.

Próximos pasos