memcached | |
---|---|
Tipo de | cache |
Desarrollador | Danga Interactivo [d] |
Escrito en | C [1] |
Sistema operativo | multiplataforma |
Primera edición | 22 de mayo de 2003 |
ultima versión |
|
Licencia | licencia BSD modificada [d] [3] |
Sitio web | memcached.org |
Memcached es un software que implementa un servicio de almacenamiento en caché de datos en memoria basado en una tabla hash .
Con la ayuda de una biblioteca de cliente (para C / C ++ , Ruby , Perl , PHP , Python , Java , .Net , etc.) le permite almacenar en caché datos en RAM de muchos servidores disponibles . La distribución se implementa segmentando los datos por el valor hash de la clave, similar a los sockets de tablas hash. La biblioteca del cliente calcula el hash usando la clave de datos y la usa para seleccionar el servidor apropiado. Una situación de falla del servidor se interpreta como una pérdida de caché, lo que permite aumentar la tolerancia a fallas del complejo al aumentar la cantidad de servidores Memcached y la capacidad de intercambiarlos en caliente.
La API de memcached solo tiene funciones básicas: elegir un servidor, configurar y romper una conexión, agregar, eliminar, actualizar y obtener un objeto, así como comparar e intercambiar . Para cada objeto, se establece un tiempo de vida, desde 1 segundo hasta el infinito. Cuando se agota la memoria, los objetos más antiguos se eliminan automáticamente. Para PHP , también hay bibliotecas PECL preparadas para trabajar con memcached, que brindan funcionalidad adicional.
Memcached usa el puerto 11211 de forma predeterminada.
Tenga en cuenta que todas las funciones descritas en esta sección están escritas en pseudocódigo . La sintaxis para llamar a Memcached puede diferir según el lenguaje de programación y la API utilizada.
Una consulta de base de datos (sin usar memcached) podría parecerse al siguiente ejemplo:
función get_foo ( id de usuario int ) { resultado = db_select ( "SELECCIONAR * DE usuarios DONDE ID de usuario =?" , ID de usuario ); resultado devuelto ; }Después de introducir el uso de memcached, la misma llamada puede verse así (en adelante, se usa pseudocódigo , la sintaxis para llamar a memcached puede diferir):
función get_foo ( id de usuario int ) { /* comprobar caché primero */ datos = memcached_fetch ( "fila de usuario:" + ID de usuario ); si ( ! datos ) { /* no encontrado: consulta base de datos */ datos = db_select ( "SELECCIONAR * DE usuarios DONDE ID de usuario =?" , ID de usuario ); /* almacenar en caché para futuras solicitudes */ memcached_add ( "fila de usuario:" + ID de usuario , datos ); } devolver datos ; }El servidor primero verificará si Memcached almacena un valor con una clave única "userrow: userid", donde userid es un número. Si el caché no contiene dichos datos, el servidor consultará la base de datos como de costumbre y establecerá una clave única mediante una llamada a la API de memcached.
Sin embargo, si solo se usa esta llamada API, el servidor puede devolver datos incorrectos después de cualquier actualización de la base de datos: Memcached almacenará y devolverá datos obsoletos. Por lo tanto, además de la llamada a la caché de datos, también se necesita una actualización:
función update_foo ( int ID de usuario , cadena dbUpdateString ) { /* actualizar primero la base de datos */ resultado = db_execute ( dbUpdateString ); si ( resultado ) { /* actualización de la base de datos completada: preparar datos para la entrada en caché */ datos = db_select ( "SELECCIONAR * DE usuarios DONDE ID de usuario =?" , ID de usuario ); /* la última línea también podría verse como data = createDataFromDBString(dbUpdateString); */ /* caché de datos actualizados */ memcached_set ( "filausuario:" + idusuario , datos ); } }Esta llamada solo actualizará los datos en caché para que coincidan con los nuevos datos en la base de datos si la solicitud de actualización de la base de datos tiene éxito. Otro enfoque podría ser vaciar el caché para la clave dada usando la función Memcached para que una llamada posterior no encuentre los datos en el caché y consulte la base de datos. Se necesitan acciones similares en caso de eliminar datos de la base de datos para que el caché permanezca correcto o parcialmente vacío.