Descripción general de Memcache

Esta página proporciona una descripción general del servicio Memcache de App Engine. Las aplicaciones web escalables de alto rendimiento con frecuencia usan caché de datos en memoria distribuido frente a o en lugar de un almacenamiento continuo robusto para algunas tareas. App Engine incluye un servicio de memoria caché para este fin. Para conocer cómo configurar, supervisar y usar el servicio Memcache, lee Usar Memcache.

Cuándo usar una memoria caché

Uno de los usos de una memoria caché es acelerar las consultas comunes sobre el almacén de datos. Si muchas solicitudes hacen la misma consulta con los mismos parámetros y los cambios en los resultados no necesitan aparecer en el sitio web de inmediato, la aplicación puede almacenar los resultados en Memcache. Las solicitudes posteriores pueden verificar Memcache y solo consultar el almacén de datos si los resultados no existen o han vencido. Los datos de sesión, las preferencias de usuario y otros datos mostrados por las consultas para páginas web son buenos candidatos para almacenar en caché.

Memcache puede ser útil para otros valores temporales. Sin embargo, a la hora de considerar si almacenar un valor únicamente en Memcache sin el respaldo de otro almacenamiento continuo, asegúrate de que tu aplicación se comporte de manera aceptable cuando el valor no esté disponible repentinamente. Los valores pueden vencer en Memcache en cualquier momento y pueden hacerlo antes de la fecha de vencimiento configurada para el valor. Por ejemplo, si la ausencia repentina de los datos de sesión de un usuario provocan el fallo de la sesión, esos datos probablemente deberían almacenarse en el almacén de datos además de en Memcache.

Niveles de servicio

App Engine admite dos niveles de servicio de Memcache:

  • Memcache compartida es la configuración predeterminada gratuita para las aplicaciones de App Engine. Brinda capacidad de caché sobre la base del "mejor esfuerzo" y está sujeta a la demanda general de todas las aplicaciones de App Engine que usan el servicio de Memcache compartida.

  • Memcache exclusiva proporciona una capacidad de caché fija asignada exclusivamente a tu aplicación. Se factura por GB-hora de tamaño de caché y requiere facturación para habilitarse. Disponer de control sobre el tamaño de la caché puede permitir un rendimiento más predecible de tu aplicación y reducir el número de lecturas desde un almacenamiento duradero más costoso.

Ambos niveles de servicio de Memcache usan la misma API. Para configurar el servicio de Memcache para tu aplicación, consulta Usar Memcache.

La tabla siguiente resume las diferencias entre las dos clases de servicio de Memcache

Función Memcache exclusiva Memcache compartida
Price $0.06 por GB, por hora Gratis
Capacidad
us-central
De 1 a 100 GB
otras regiones
De 1 a 20 GB
Capacidad no garantizada
Rendimiento Hasta 10,000 lecturas o 5,000 escrituras (exclusivo) por segundo por GB (elementos <1 KB). Para más detalles, consulta Estadísticas de caché. No garantizada
Almacenamiento duradero No No
ANS Ninguno Ninguno

La facturación de Memcache exclusiva se cobra en incrementos de 15 minutos. Si pagas en una moneda distinta del dólar estadounidense, se aplican los precios que aparecen en tu moneda en los SKU de Cloud Platform.

Si tu aplicación necesita más capacidad de Memcache, comunícate con nuestro equipo de ventas.

Límites

Se aplican los límites siguientes al uso del servicio de Memcache:

  • El tamaño máximo de un valor de datos almacenado en caché es de 1 MiB (2^20 bytes) menos el tamaño de la clave menos una sobrecarga que depende de la implementación, que es aproximadamente de 73 bytes.
  • Una clave no debe superar los 250 bytes. En el entorno de ejecución de Java, las claves que son objetos o strings de más de 250 bytes generarán un hash. (Otros entornos de ejecución se comportan de manera diferente).
  • Las operaciones de lotes múltiples pueden tener cualquier cantidad de elementos. El tamaño total de la llamada y el tamaño total de los datos recuperados no deben exceder los 32 megabytes.
  • Una clave de Memcache no puede contener un byte nulo.

API disponibles

Memcache de App Engine admite dos interfaces: una API de Memcache de bajo nivel y la especificación de JCache. Las secciones siguientes proporcionan más información sobre cada interfaz.

API de bajo nivel

La API de Memcache de bajo nivel admite más funcionalidades en comparación con JCache. Los ejemplos incluyen:

  • Aumentar y disminuir de manera atómica los valores de contador de número entero.
  • Exponer más estadísticas de caché, como la cantidad de tiempo desde que se accedió a la entrada menos usada recientemente, y el tamaño total de los elementos en caché.
  • Comprobar y configurar operaciones para almacenar datos condicionalmente.
  • Realizar operaciones de Memcache de forma asíncrona, usando el AsyncMemcacheService.

La API de bajo nivel proporciona MemcacheService y AsyncMemcacheService para acceder al servicio de Memcache. Esta API es más rica que la que proporciona JCache.

Consulta Ejemplos de Memcache para obtener ejemplos de uso síncrono y asíncrono de la API de Memcache de bajo nivel.

JCache

El SDK de Java de App Engine es compatible con la API de JCache. JCache proporciona una interfaz similar a un mapa para datos en caché. Los valores se almacenan y recuperan en caché con claves. Las claves y los valores pueden ser de cualquier clase o tipo serializable. Para obtener más detalles, consulta Usar Memcache.

Características de JCache no compatibles

JCache no admite las siguientes características:

  • La API de agente de escucha de JCache admite parcialmente agentes de escucha que se pueden ejecutar durante el procesamiento de una llamada a la API de aplicación, como para los agentes de escucha onPut y onRemove. Los agentes de escucha que requieren procesamiento en segundo plano, como onEvict, no son compatibles.
  • Una aplicación puede probar si la caché contiene una clave dada, pero no puede probar si contiene un valor dado (containsValue() no es compatible).
  • Una aplicación no puede volcar los contenidos de los valores o claves de caché.
  • Una aplicación no puede restablecer manualmente las estadísticas de caché.
  • El método put() no muestra el valor conocido previo para una clave. Siempre muestra null.

Cómo vencen los datos almacenados en caché

Memcache contiene pares de clave/valor. Los pares en memoria cambian en cualquier momento a medida que los elementos se escriben y recuperan de la caché.

De forma predeterminada, los valores almacenados en Memcache se retienen tanto como sea posible. Los valores pueden expulsarse de la caché cuando se agrega un nuevo valor a la caché y esta tiene poca memoria. Cuando los valores se expulsan debido a la presión en la memoria, los primeros valores que se expulsan son los menos usados recientemente.

La aplicación puede proporcionar una fecha de vencimiento cuando se almacena un valor, ya sea como una cantidad de segundos en relación con la del momento que se agrega el valor, o como un punto de inicio del tiempo UNIX absoluto en el futuro (una cantidad de segundos desde la medianoche del 1 de enero de 1970). El valor se expulsa a más tardar en esa fecha, a pesar de que puede expulsarse anteriormente por otros motivos. Aumentar el valor almacenado para una clave existente no actualiza su fecha de vencimiento.

En circunstancias excepcionales, los valores también pueden desaparecer de la caché antes del vencimiento por motivos diferentes a la presión en la memoria. Si bien Memcache es resistente a las fallas del servidor, los valores de Memcache no se guardan en el disco, por lo que una falla en el servicio puede hacer que los valores no estén disponibles.

En general, una aplicación no debería esperar que un valor almacenado en caché esté siempre disponible.

Puedes borrar toda la caché de una aplicación a través de la API o en la sección de Memcache de Google Cloud Platform Console.

Estadísticas de caché

Operaciones por segundo según el tamaño del elemento

La Memcache exclusiva se clasifica en operaciones por segundo por GB, en las que una operación se define como un acceso de elemento de caché individual, como get, set, o delete. La tasa de la operación varía según el tamaño del elemento aproximadamente de acuerdo con la tabla siguiente. Superar estas tasas puede dar como resultado un aumento de la latencia de la API o errores.

Las tablas siguientes proporcionan la cantidad máxima de operaciones get-hit o set sostenidas y exclusivas por GB de caché. Ten en cuenta que una operación get-hit es una llamada get que descubre que existe un valor almacenado con una clave determinada, y muestra ese valor.

Tamaño del elemento (KB) Máximo de operaciones get-hit Máximo de operaciones set
≤1 10,000 5,000
100 2,000 1,000
512 500 250

Una aplicación configurada para varios GB de caché puede, en teoría, lograr una tasa de operación acumulada calculada como la cantidad de GB multiplicada por la tasa por GB. Por ejemplo, una aplicación configurada para 5 GB de caché podría alcanzar 50,000 operaciones de Memcache por segundo en elementos de 1 KB. Lograr este nivel requiere una buena distribución de la carga en el espacio de claves de Memcache, como se describe en Recomendaciones para Memcache de App Engine.

Para cada patrón de IO, los límites mencionados anteriormente corresponden a lecturas o escrituras. Para lecturas y escrituras simultáneas, los límites están en escala variable. Cuantas más lecturas se ejecuten, menos escrituras se ejecutarán y viceversa. Cada uno de los siguientes son ejemplos de límites de IOPS para lecturas y escrituras simultáneas de valores de 1 KB por 1 GB de caché.

IOPS de lectura IOPS de escritura
10,000 0
8,000 1,000
5,000 2,500
1,000 4,500
0 5,000

Unidades de procesamiento de Memcache (MCU)

La capacidad de procesamiento de Memcache puede variar según el tamaño del elemento al que estás accediendo y la operación que deseas realizar en el elemento. Puedes asociar aproximadamente un costo con operaciones y calcular la capacidad de tráfico que puedes esperar de la Memcache exclusiva mediante el uso de una unidad llamada Unidad de procesamiento de Memcache (MCU). La MCU se define de tal manera que puedes esperar 10,000 MCU por segundo por GB de Memcache exclusiva. Google Cloud Platform Console muestra cuántas MCU usa actualmente tu aplicación.

Ten en cuenta que la MCU es un cálculo estadístico aproximado y que, además, no es una unidad lineal. Cada operación de caché que lee o escribe un valor tiene un costo de MCU correspondiente que depende del tamaño del valor. La MCU para set depende del tamaño del valor: es 2 veces el costo de una operación get-hit exitosa.

Tamaño del elemento de valor (KB) Costo de la MCU para get-hit Costo de la MCU para set
≤1 1.0 2.0
2 1.3 2.6
10 1.7 3.4
100 5.0 10.0
512 20.0 40.0
1,024 50.0 100.0

Las operaciones que no leen o escriben un valor tienen un costo de MCU fijo:

Operación MCU
get-miss 1.0
delete 2.0
increment 2.0
flush 100.0
stats 100.0

Ten en cuenta que una operación get-miss es una get que descubre que no existe un valor almacenado con la clave especificada.

Recomendaciones

A continuación, se mencionan algunas recomendaciones para el uso de Memcache:

  • Maneja las fallas de la API de Memcache con elegancia. Las operaciones de Memcache pueden fallar por diversos motivos. Las aplicaciones deberían diseñarse para detectar operaciones fallidas sin exponer estos errores a los usuarios finales. Esta guía se aplica especialmente a las operaciones Set.

  • Usa la capacidad de lotes de la API cuando sea posible, en especial para elementos pequeños. Hacerlo así aumenta el rendimiento y la eficiencia de tu aplicación.

  • Distribuye la carga en tu espacio de claves de Memcache. Tener un conjunto único o pequeño de elementos de Memcache representa una cantidad desproporcionada de tráfico que dificultará el escalamiento de tu aplicación. Esta guía se aplica tanto a las operaciones por segundo como al ancho de banda. A menudo, puedes solucionar este problema fragmentando de forma explícita tus datos.

    Por ejemplo, puedes dividir un contador frecuentemente actualizado entre diversas claves, y volver a leerlas y sumarlas solo cuando necesites un total. De igual manera, puedes dividir una porción de 500,000 datos que debe leerse en cada solicitud HTTP en varias claves y volver a leerlas con una única llamada a la API de lote. (Sería incluso mejor almacenar en caché el valor en la memoria de la instancia). Para la Memcache exclusiva, la tasa de acceso máxima en una clave única debería ser de 1-2 órdenes de magnitud menores a la clasificación por GB.

Para obtener más detalles y más recomendaciones sobre simultaneidad, rendimiento y migración, que incluye compartir Memcache entre diferentes lenguajes de programación, lee el artículo Recomendaciones para Memcache de App Engine.

Pasos siguientes

  • Aprende a configurar, supervisar y usar Memcache en Usar Memcache.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Java