Por qué Redis supera a Memcached para el almacenamiento en caché

Memcached o Redis? Es una pregunta que casi siempre surge en cualquier discusión sobre cómo sacar más rendimiento de una aplicación web moderna basada en bases de datos. Cuando es necesario mejorar el rendimiento, el almacenamiento en caché suele ser el primer paso y Memcached o Redis suelen ser los primeros lugares a los que acudir.

Estos reconocidos motores de caché comparten una serie de similitudes, pero también tienen diferencias importantes. Redis, el más nuevo y versátil de los dos, es casi siempre la mejor opción.

Redis vs Memcached para almacenamiento en caché

Empecemos por las similitudes. Tanto Memcached como Redis sirven como almacenes de datos de valor clave en memoria, aunque Redis se describe con mayor precisión como un almacén de estructura de datos. Tanto Memcached como Redis pertenecen a la familia de soluciones de gestión de datos NoSQL, y ambos se basan en un modelo de datos clave-valor. Ambos mantienen todos los datos en la RAM, lo que, por supuesto, los hace sumamente útiles como capa de almacenamiento en caché. En términos de rendimiento, los dos almacenes de datos también son notablemente similares, exhibiendo características (y métricas) casi idénticas con respecto al rendimiento y la latencia.

Tanto Memcached como Redis son proyectos de código abierto maduros y muy populares. Memcached fue desarrollado originalmente por Brad Fitzpatrick en 2003 para el sitio web LiveJournal. Desde entonces, Memcached se ha reescrito en C (la implementación original estaba en Perl) y se ha puesto en el dominio público, donde se ha convertido en una piedra angular de las aplicaciones web modernas. El desarrollo actual de Memcached se centra en la estabilidad y las optimizaciones en lugar de agregar nuevas funciones.

Redis fue creado por Salvatore Sanfilippo en 2009, y Sanfilippo sigue siendo el desarrollador líder del proyecto en la actualidad. A veces, Redis se describe como "Memcached con esteroides", lo que no es sorprendente si se considera que partes de Redis se crearon en respuesta a las lecciones aprendidas al usar Memcached. Redis tiene más funciones que Memcached y es, por tanto, más potente y flexible.

Usado por muchas empresas y en innumerables entornos de producción de misión crítica, Memcached y Redis son compatibles con bibliotecas de cliente en todos los lenguajes de programación imaginables, y se incluye en una multitud de paquetes para desarrolladores. De hecho, es una pila web poco común que no incluye soporte integrado para Memcached o Redis.

¿Por qué Memcached y Redis son tan populares? No solo son extremadamente efectivos, también son relativamente simples. Comenzar con Memcached o Redis se considera un trabajo fácil para un desarrollador. Solo lleva unos minutos configurar y hacer que funcionen con una aplicación. Por lo tanto, una pequeña inversión de tiempo y esfuerzo puede tener un impacto inmediato y dramático en el desempeño, generalmente en órdenes de magnitud. Una solución simple con un gran beneficio; eso es lo más cercano a la magia que puedes conseguir.

Cuando usar Memcached

Memcached podría ser preferible al almacenar en caché datos relativamente pequeños y estáticos, como fragmentos de código HTML. La administración de memoria interna de Memcached, aunque no es tan sofisticada como la de Redis, es más eficiente en los casos de uso más simples porque consume comparativamente menos recursos de memoria para metadatos. Las cadenas (el único tipo de datos admitido por Memcached) son ideales para almacenar datos que solo se leen, porque las cadenas no requieren más procesamiento.

Los conjuntos de datos grandes a menudo implican datos serializados, que siempre requieren más espacio para almacenar. Si bien Memcached está efectivamente limitado a almacenar datos en su forma serializada, las estructuras de datos en Redis pueden almacenar cualquier aspecto de los datos de forma nativa, reduciendo así la sobrecarga de serialización.

El segundo escenario en el que Memcached tiene una ventaja sobre Redis es el escalado. Debido a que Memcached es multiproceso, puede escalar fácilmente dándole más recursos computacionales, pero perderá parte o todos los datos almacenados en caché (dependiendo de si usa hash consistente). Redis, que es principalmente de un solo subproceso, puede escalar horizontalmente a través de la agrupación en clústeres sin pérdida de datos. La agrupación en clústeres es una solución de escalamiento eficaz, pero es comparativamente más compleja de configurar y operar.

Cuando usar Redis

Casi siempre querrá usar Redis debido a sus estructuras de datos. Con Redis como caché, obtiene mucha potencia (como la capacidad de ajustar el contenido y la durabilidad de la caché) y una mayor eficiencia en general. Una vez que utiliza las estructuras de datos, el aumento de la eficiencia se vuelve tremendo para escenarios de aplicación específicos.

La superioridad de Redis es evidente en casi todos los aspectos de la administración de caché. Los cachés emplean un mecanismo llamado desalojo de datos para hacer espacio para nuevos datos al eliminar los datos antiguos de la memoria. El mecanismo de desalojo de datos de Memcached emplea un algoritmo de uso menos reciente y desaloja de manera algo arbitraria los datos que son similares en tamaño a los nuevos datos.

Redis, por el contrario, permite un control detallado sobre el desalojo, lo que le permite elegir entre seis políticas de desalojo diferentes. Redis también emplea enfoques más sofisticados para la gestión de la memoria y la selección de candidatos para el desalojo. Redis admite el desalojo activo y perezoso, donde los datos se expulsan solo cuando se necesita más espacio o de forma proactiva. 

Redis le brinda una flexibilidad mucho mayor con respecto a los objetos que puede almacenar en caché. Si bien Memcached limita los nombres de las claves a 250 bytes y funciona solo con cadenas simples, Redis permite que los nombres y valores de las claves sean tan grandes como 512 MB cada uno, y son binarios seguros. Además, Redis tiene cinco estructuras de datos primarias para elegir, lo que abre un mundo de posibilidades para el desarrollador de aplicaciones a través del almacenamiento en caché inteligente y la manipulación de los datos almacenados en caché.

Redis para la persistencia de datos

El uso de estructuras de datos de Redis puede simplificar y optimizar varias tareas, no solo durante el almacenamiento en caché, sino incluso cuando desea que los datos sean persistentes y estén siempre disponibles. Por ejemplo, en lugar de almacenar objetos como cadenas serializadas, los desarrolladores pueden usar un Hash de Redis para almacenar los campos y valores de un objeto y administrarlos con una sola clave. Redis Hash ahorra a los desarrolladores la necesidad de recuperar la cadena completa, deserializarla, actualizar un valor, volver a formalizar el objeto y reemplazar la cadena completa en la caché con su nuevo valor para cada actualización trivial, lo que significa un menor consumo de recursos y un mayor rendimiento.

Otras estructuras de datos ofrecidas por Redis (como listas, conjuntos, conjuntos ordenados, hiperloglogs, mapas de bits e índices geoespaciales) se pueden utilizar para implementar escenarios aún más complejos. Los conjuntos ordenados para la ingesta y el análisis de datos de series de tiempo son otro ejemplo de una estructura de datos de Redis que ofrece una complejidad enormemente reducida y un menor consumo de ancho de banda.

Otra ventaja importante de Redis es que los datos que almacena no son opacos, por lo que el servidor puede manipularlos directamente. Una parte considerable de los más de 180 comandos disponibles en Redis están dedicados a operaciones de procesamiento de datos e incrustación de lógica en el propio almacén de datos a través de scripts Lua del lado del servidor. Estos comandos y scripts de usuario integrados le brindan la flexibilidad de manejar tareas de procesamiento de datos directamente en Redis sin tener que enviar datos a través de la red a otro sistema para su procesamiento.

Redis ofrece una persistencia de datos opcional y ajustable diseñada para arrancar la caché después de un cierre planificado o una falla no planificada. Si bien tendemos a considerar los datos en cachés como volátiles y transitorios, los datos persistentes en el disco pueden ser bastante valiosos en escenarios de almacenamiento en caché. Tener los datos de la caché disponibles para cargarlos inmediatamente después del reinicio permite un calentamiento de la caché mucho más corto y elimina la carga involucrada en repoblar y recalcular el contenido de la caché del almacén de datos principal.

Replicación de datos en memoria de Redis 

Redis también puede replicar los datos que administra. La replicación se puede utilizar para implementar una configuración de caché de alta disponibilidad que pueda soportar fallas y brindar un servicio ininterrumpido a la aplicación. Un fallo de caché es solo un poco menor que el fallo de la aplicación en términos del impacto en la experiencia del usuario y el rendimiento de la aplicación, por lo que tener una solución probada que garantice el contenido del caché y la disponibilidad del servicio es una gran ventaja en la mayoría de los casos.

Por último, pero no menos importante, en términos de visibilidad operativa, Redis proporciona una gran cantidad de métricas y una gran cantidad de comandos introspectivos con los que monitorear y rastrear el uso y el comportamiento anormal. Estadísticas en tiempo real sobre todos los aspectos de la base de datos, la visualización de todos los comandos que se ejecutan, la lista y la administración de las conexiones de los clientes; Redis tiene todo eso y más.

Cuando los desarrolladores se dan cuenta de la efectividad de la persistencia de Redis y las capacidades de replicación en memoria, a menudo la usan como una base de datos de primera respuesta, generalmente para analizar y procesar datos de alta velocidad y proporcionar respuestas al usuario mientras se mantiene una base de datos secundaria (a menudo más lenta). un registro histórico de lo sucedido. Cuando se usa de esta manera, Redis también puede ser ideal para casos de uso de análisis.

Redis para análisis de datos

Inmediatamente me vienen a la mente tres escenarios analíticos. En el primer escenario, cuando se usa algo como Apache Spark para procesar iterativamente grandes conjuntos de datos, puede usar Redis como una capa de servicio para los datos previamente calculados por Spark. En el segundo escenario, usar Redis como su almacén de datos distribuido, compartido y en memoria puede acelerar las velocidades de procesamiento de Spark en un factor de 45 a 100. Por último, un escenario muy común es aquel en el que los informes y análisis deben ser personalizables por el usuario, pero la recuperación de datos de almacenes de datos intrínsecamente por lotes (como Hadoop o un RDBMS) lleva demasiado tiempo. En este caso, un almacén de estructura de datos en memoria como Redis es la única forma práctica de obtener tiempos de respuesta y de paginación de menos de milisegundos.

Cuando se utilizan conjuntos de datos operativos o cargas de trabajo analíticas extremadamente grandes, es posible que ejecutar todo en la memoria no sea rentable. Para lograr un rendimiento de menos de milisegundos a menor costo, Redis Labs creó una versión de Redis que se ejecuta en una combinación de RAM y flash, con la opción de configurar proporciones de RAM a flash. Si bien esto abre varias vías nuevas para acelerar el procesamiento de la carga de trabajo, también brinda a los desarrolladores la opción de simplemente ejecutar su "caché en flash".

El software de código abierto continúa proporcionando algunas de las mejores tecnologías disponibles en la actualidad. Cuando se trata de mejorar el rendimiento de las aplicaciones a través del almacenamiento en caché, Redis y Memcached son los candidatos más establecidos y probados en producción. Sin embargo, dada la funcionalidad más rica de Redis, el diseño más avanzado, muchos usos potenciales y una mayor rentabilidad a escala, Redis debería ser su primera opción en casi todos los casos.

---

Itamar Haber (@itamarhaber) es el principal defensor de desarrolladores de Redis Labs, que ofrece Memcached y Redis como servicios en la nube totalmente gestionados para desarrolladores. Su variada experiencia incluye el desarrollo y la gestión de productos de software y roles de liderazgo en Xeround, Etagon, Amicada y MNS Ltd. de Ciencias en Ciencias de la Computación.

New Tech Forum proporciona un lugar para explorar y discutir la tecnología empresarial emergente con una profundidad y amplitud sin precedentes. La selección es subjetiva, basada en nuestra selección de las tecnologías que creemos que son importantes y de mayor interés para los lectores. no acepta material de marketing para su publicación y se reserva el derecho de editar todo el contenido contribuido. Envíe todas sus consultas a [email protected]