En informática , Memcached (pronunciado /mɛmkæʃˈdiː/ mem-cash-DEE ["dee/d" de daemon ], o /ˈmɛmkæʃt/ MEM-cashed ) es un sistema de almacenamiento en caché de memoria distribuida de propósito general . Se usa a menudo para acelerar sitios web dinámicos basados en bases de datos , almacenando en caché datos y objetos en la RAM para reducir la cantidad de veces que se debe leer una fuente de datos externa (como una base de datos o una API). Memcached es software libre y de código abierto , con licencia BSD revisada . [ 2 ] Memcached se ejecuta en sistemas operativos tipo Unix ( Linux y macOS ) y en Microsoft Windows . Depende de la biblioteca libevent .
Las API de Memcached proporcionan una tabla hash de gran tamaño distribuida en varias máquinas. Cuando la tabla está llena, las inserciones posteriores provocan la eliminación de los datos más antiguos en orden de uso menos reciente (LRU). [ 3 ] [ 4 ] Las aplicaciones que utilizan Memcached suelen almacenar las solicitudes y adiciones en la RAM antes de recurrir a un almacenamiento de respaldo más lento, como una base de datos.
Memcached no tiene ningún mecanismo interno para detectar los fallos que puedan producirse. Sin embargo, algunas utilidades de terceros ofrecen esta funcionalidad.
Memcached fue desarrollado por primera vez por Brad Fitzpatrick para su sitio web LiveJournal , el 22 de mayo de 2003. [ 5 ] [ 6 ] Originalmente fue escrito en Perl , luego reescrito en C por Anatoly Vorobey, quien trabajaba para LiveJournal en ese momento. [ 7 ] Memcached ahora es utilizado por muchos otros sistemas, incluyendo YouTube , [ 8 ] Reddit , [ 9 ] Facebook , [ 10 ] [ 11 ] Pinterest , [ 12 ] [ 13 ] Twitter , [ 14 ] Wikipedia , [ 15 ] y Method Studios . [ 16 ] Google App Engine , Google Cloud Platform , Microsoft Azure , IBM Bluemix y Amazon Web Services también ofrecen un servicio Memcached a través de una API. [ 17 ] [ 18 ] [ 19 ] [ 20 ]
Arquitectura de software
El sistema utiliza una arquitectura cliente-servidor . Los servidores mantienen una matriz asociativa clave-valor ; los clientes rellenan esta matriz y la consultan mediante claves. Las claves tienen una longitud máxima de 250 bytes y los valores pueden tener un tamaño máximo de 1 megabyte .
Los clientes utilizan bibliotecas del lado del cliente para contactar con los servidores, que, por defecto, exponen su servicio en el puerto 11211. Se admiten tanto TCP como UDP. Cada cliente conoce a todos los servidores; los servidores no se comunican entre sí. Si un cliente desea establecer o leer el valor correspondiente a una clave determinada, la biblioteca del cliente calcula primero un hash de la clave para determinar qué servidor utilizar. Esto proporciona una forma sencilla de fragmentación y una arquitectura escalable sin recursos compartidos entre los servidores. El servidor calcula un segundo hash de la clave para determinar dónde almacenar o leer el valor correspondiente. Los servidores mantienen los valores en la RAM (y, a partir de la versión 1.6.0, en una caché auxiliar en disco mediante una opción de servidor de almacenamiento externo); [ 21 ] si un servidor se queda sin memoria o disco disponible, descarta los valores más antiguos. Por lo tanto, los clientes deben tratar Memcached como una caché transitoria; no pueden asumir que los datos almacenados en Memcached seguirán ahí cuando los necesiten. Otras bases de datos, como MemcacheDB y Couchbase Server , proporcionan almacenamiento persistente manteniendo la compatibilidad con el protocolo Memcached.
Si todas las bibliotecas cliente utilizan el mismo algoritmo de hash para determinar los servidores, entonces los clientes pueden leer los datos almacenados en caché de los demás.
Una implementación típica cuenta con varios servidores y numerosos clientes. Sin embargo, es posible usar Memcached en un solo equipo, funcionando simultáneamente como cliente y servidor. El tamaño de su tabla hash suele ser muy grande, limitado por la memoria disponible en todos los servidores del clúster del centro de datos. En aplicaciones con un alto volumen de publicaciones web dirigidas a un público amplio, este tamaño puede alcanzar varios gigabytes. Memcached también resulta valioso en situaciones donde el número de solicitudes de contenido es elevado o el coste de generar un contenido específico es alto. Las aplicaciones con necesidades de almacenamiento en caché particularmente exigentes pueden usar un proxy integrado para definir y configurar rutas complejas entre cliente y servidor. [ 21 ]
Seguridad
La mayoría de las implementaciones de Memcached se realizan en redes de confianza donde los clientes pueden conectarse libremente a cualquier servidor. Sin embargo, en ocasiones, Memcached se implementa en redes no confiables o donde los administradores desean controlar a los clientes que se conectan. Para ello, Memcached puede compilarse con soporte opcional para autenticación SASL . El soporte para SASL requiere el protocolo binario.
Una presentación en BlackHat USA 2010 reveló que varios sitios web públicos de gran tamaño habían dejado Memcached abierto a la inspección, el análisis, la recuperación y la modificación de datos. [ 22 ]
Incluso dentro de una organización de confianza, el modelo de confianza plana de memcached puede tener implicaciones de seguridad. Para mayor eficiencia y simplicidad, todas las operaciones de memcached se tratan por igual. Los clientes con una necesidad válida de acceder a entradas de baja seguridad en la caché obtienen acceso a todas las entradas, incluso si estas son de mayor seguridad y el cliente no tiene una necesidad justificada de ellas. Si la clave de caché se puede predecir, adivinar o encontrar mediante una búsqueda exhaustiva, se puede recuperar su entrada en la caché.
En situaciones como la publicación web de alto volumen, se pueden realizar algunos intentos para aislar la configuración y la lectura de datos. Un conjunto de servidores de contenido externos tiene acceso de lectura a memcached, que contiene páginas o componentes de página publicados, pero no de escritura. Cuando se publica contenido nuevo (que aún no está en memcached), se envía una solicitud a servidores de generación de contenido que no son de acceso público para crear la unidad de contenido y agregarla a memcached. El servidor de contenido intenta entonces recuperarla y distribuirla.
Utilizado como vector de ataque DDoS
En febrero de 2018, CloudFlare informó que servidores memcached mal configurados se utilizaron para lanzar ataques DDoS a gran escala. [ 23 ] El protocolo memcached sobre UDP tiene un enorme factor de amplificación , de más de 51000. [ 24 ] Entre las víctimas de los ataques DDoS se encuentra GitHub , que se vio inundado con un pico de tráfico entrante de 1,35 Tbit/s. [ 25 ]
Este problema se mitigó en la versión 1.5.6 de Memcached, que deshabilitó el protocolo UDP por defecto. [ 26 ]
Código de ejemplo
Tenga en cuenta que todas las funciones descritas en esta página son pseudocódigo . Las llamadas a Memcached y los lenguajes de programación pueden variar según la API utilizada.
Convertir consultas de creación de bases de datos u objetos para usar Memcached es sencillo. Normalmente, al usar consultas directas a la base de datos, el código de ejemplo sería el siguiente:
función get_foo ( int userid ) datos = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) devolver datosTras la conversión a Memcached, la misma llamada podría verse así:
function get_foo ( int userid ) /* primero intenta con la caché */ data = memcached_fetch ( "userrow:" + userid ) if not data /* no encontrado: solicita a la base de datos */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) /* luego almacena en caché hasta la siguiente obtención */ memcached_add ( "userrow:" + userid , data ) enddatos de retornoEl cliente primero comprobaría si existe un valor de Memcached con la clave única "userrow:userid", donde userid es un número. Si el resultado no existe, lo consultaría en la base de datos como de costumbre y establecería la clave única mediante la llamada a la función add de la API de Memcached.
Sin embargo, si solo se modificara esta llamada a la API, el servidor obtendría datos incorrectos tras cualquier actualización de la base de datos: la vista de Memcached de los datos quedaría desactualizada. Por lo tanto, además de crear una llamada para agregar datos, también sería necesaria una llamada para actualizar datos utilizando la función de configuración de Memcached.
function update_foo ( int userid , string dbUpdateString ) /* primera actualización de la base de datos */ result = db_execute ( dbUpdateString ) if result /* actualización de la base de datos exitosa: obtener los datos para almacenarlos en caché */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) /* la línea anterior también podría verse así data = createDataFromDBString(dbUpdateString) */ /* luego almacenar en caché hasta la próxima obtención */ memcached_set ( "userrow:" + userid , data )Esta llamada actualizaría los datos almacenados en caché para que coincidan con los nuevos datos de la base de datos, siempre que la consulta a la base de datos sea exitosa. Un enfoque alternativo sería invalidar la caché con la función `delete` de Memcached, de modo que las recuperaciones posteriores resulten en un fallo de caché. Sería necesario tomar medidas similares cuando se eliminen registros de la base de datos, para mantener una caché correcta o incompleta.
Una estrategia alternativa para invalidar la caché consiste en almacenar un número aleatorio en una entrada de caché acordada e incorporar este número a todas las claves que se utilizan para almacenar un tipo específico de entrada. Para invalidar todas estas entradas a la vez, basta con cambiar el número aleatorio. Las entradas existentes (que se almacenaron con el número anterior) dejarán de tener referencias y, por lo tanto, caducarán o se reciclarán.
function store_xyz_entry ( int key , string value ) /* Recupera el número aleatorio; usa cero si aún no existe ninguno. * El nombre de la clave que se usa aquí es arbitrario. */ seed = memcached_fetch ( ":xyz_seed:" ) if not seed seed = 0 /* Construye la clave que se usa para almacenar la entrada y la almacena. * El nombre de la clave que se usa aquí también es arbitrario. Observa que la "semilla" y la "clave" del usuario * se almacenan como partes separadas de la cadena hashKey construida: ":xyz_data:(semilla):(clave)." * Esto no es obligatorio, pero se recomienda. */ string hashKey = sprintf ( ":xyz_data:%d:%d" , seed , key ) memcached_set ( hashKey , value )/* "fetch_entry", no se muestra, sigue la misma lógica que la anterior. */function invalidate_xyz_cache () existing_seed = memcached_fetch ( ":xyz_seed:" ) /* Generar una semilla aleatoria diferente */ do seed = rand () until seed != existing_seed /* Almacenarla en el lugar acordado. Todas las solicitudes futuras usarán este número. * Por lo tanto, todas las entradas existentes dejan de tener referencias y eventualmente caducarán. */ memcached_set ( ":xyz_seed:" , seed )Uso
- MySQL admite directamente la API de Memcached a partir de la versión 5.6. [ 27 ]
- Oracle Coherence : admite directamente la API de Memcached a partir de la versión 12.1.3. [ 28 ]
- Infinispan : admite directamente Memcached. [ 29 ]
Véase también
Referencias
- ↑ "Versión 1.6.45" . 10 de julio de 2026. Consultado el 10 de julio de 2026 .
- 1 2 "Licencia de Memcached" . GitHub . Consultado el 27 de junio de 2014 .
- ↑ "Archivo de Google Code: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code" . Code.google.com . Consultado el 25 de junio de 2017 .
- ↑ "Archivo de Google Code: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code" . Code.google.com . Consultado el 25 de junio de 2017 .
- ↑. Community.livejournal.com (22 de mayo de 2003). Consultado el 18 de septiembre de 2013.
- ↑. Community.livejournal.com (27 de mayo de 2003). Consultado el 18 de septiembre de 2013.
- ↑ "lj_dev: memcached" . 25/02/2013. Archivado del original el 25/02/2013 . Consultado el 25/06/2017 .
- ↑ Cuong Do Cuong (Gerente de ingeniería en YouTube/Google) (23 de junio de 2007). Conferencia de Seattle sobre escalabilidad: Escalabilidad de YouTube (Vídeo en línea - minuto 26). Seattle: Google Tech Talks.
- ↑ Whitaker, Keir (17 de mayo de 2010). "Steve Huffman sobre las lecciones aprendidas en Reddit | Carsonified" . Archivado del original el 17 de mayo de 2010. Consultado el 25 de junio de 2017 .
- ↑ "Escalando memcached en Facebook" . Facebook.com . 12 de diciembre de 2008. Consultado el 25 de junio de 2017 .
- ↑ Escalado de Memcache en Facebook . USENIX. 2002. ISBN 9781931971003. Consultado el 25 de junio de 2017 .
- ↑ "Construyendo Pinterest en la nube" . Pinterest Careers . 19 de junio de 2013. Consultado el 9 de marzo de 2018 .
- ↑ "Un cliente memcached completo, rápido y escrito completamente en Python" . Github.com . 8 de enero de 2018. Consultado el 9 de marzo de 2018 .
- ↑ "No es ciencia espacial, pero es nuestro trabajo" . Blog.twitter.com . 1 de junio de 2008. Consultado el 25 de junio de 2017 .
- ↑ "memcached" . MediaWiki . Consultado el 25 de junio de 2017 .
- ↑ Rez BoF, SIGGRAPH 2019 , archivado del original el 12/12/2021 , recuperado el 09/08/2019
- ↑ "Ejemplos de Memcache | Entorno estándar de App Engine para Python | Google Cloud Platform" . Code.google.com . 22 de marzo de 2017. Consultado el 25 de junio de 2017 .
- ↑ "Acerca de la caché en rol para Azure Cache" . Msdn.microsoft.com . 25 de agosto de 2015. Consultado el 25 de junio de 2017 .
- ↑ Verge, Jason (23 de septiembre de 2014). "Redis Labs: Tenemos 3000 clientes de pago de NoSQL en memoria en la nube" . Data Center Knowledge . Recuperado el 10 de septiembre de 2016 .
- ↑ "AWS | Amazon ElastiCache: almacenamiento y caché de datos en memoria" . Aws.amazon.com . Consultado el 25 de junio de 2017 .
- 1 2 McIntosh, Jason (14 de febrero de 2025). "La evolución de Memcached" . LWN . Recuperado el 14 de febrero de 2025 .
- ↑ "SensePost | Artículo de Blackhat: Go-derper y la minería de memcaches" . Archivado del original el 21/12/2018 . Consultado el 02/09/2016 .
- ↑ "Memcrashed - Ataques de amplificación importantes desde el puerto UDP 11211" . CloudFlare. 27 de febrero de 2018. Consultado el 3 de marzo de 2018 .
- ↑ Jeffrey, Cal (1 de marzo de 2018). "GitHub es víctima del mayor ataque DDoS jamás registrado" .
- ↑ "Informe del incidente DDoS del 28 de febrero" . 1 de marzo de 2018. Consultado el 3 de marzo de 2018 .
- ↑ "Notas de la versión 1.5.6 de Memcached" . GitHub . 27 de febrero de 2018. Consultado el 3 de marzo de 2018 .
- ↑ "Speedy MySQL 5.6 apunta a NoSQL, MariaDB" . Theregister.co.uk . Consultado el 25 de junio de 2017 .
- ↑ David Felcey (13 de agosto de 2014). "Primeros pasos con el adaptador Memcached de Coherence | Blog de Oracle Coherence" . Blogs.oracle.com . Archivado del original el 23 de febrero de 2017. Consultado el 25 de junio de 2017 .
- ↑ "Uso del punto final del protocolo Memcached con Infinispan" . infinispan.org . Consultado el 19 de abril de 2022 .
Enlaces externos
- Software de 2003
- Software multiplataforma
- Almacenamiento en caché de bases de datos
- Software gratuito de gestión de memoria
- Bases de datos clave-valor
- Software que utiliza la licencia BSD.
- Almacenamiento estructurado