Si redis ya es parte de la pila, ¿por qué Memcached todavía se usa junto con Redis?

85

Redis puede hacer todo lo que proporciona Memcached (caché de LRU, caducidad de elementos y ahora agrupación en clústeres en la versión 3.x +, actualmente en beta) o mediante herramientas como twemproxy. El rendimiento también es similar. Además, Redis agrega persistencia debido a que no es necesario calentar la caché en caso de reiniciar el servidor.

Referencia a algunas respuestas antiguas que comparan Redis y Memcache, algunas de las cuales favorecen a Redis como reemplazo de Memcache (si ya está presente en la pila):

A pesar de esto, al estudiar pilas de empresas de gran escala web como Instagram, Pinterest, Twitter, etc., descubrí que usan Memcached y Redis para diferentes propósitos, no Redis para el almacenamiento en caché primario. La caché principal sigue siendo Memcached, y Redis se utiliza para su almacenamiento en caché lógico basado en estructuras de datos.

A partir de 2014, ¿por qué vale la pena agregar memcached como componente adicional a su pila, cuando ya tiene un componente de Redis que puede hacer todo lo que memcached puede hacer? ¿Cuáles son los puntos favorables que inclinan a los arquitectos / ingenieros a incluir Memcached aparte de Redis ya existente?

Actualización:

Para nuestras plataformas, hemos descartado Memcached por completo y usamos redis para requisitos de almacenamiento en caché tanto sencillos como lógicos. De alto rendimiento, flexible y confiable.

Algunos escenarios de ejemplo:

  • Enumerar todas las claves almacenadas en caché según un patrón específico y leer o eliminar sus valores. Muy fácil en redis, no factible (fácilmente) en memcached.
  • Almacenar una carga útil de más de 1 MB, fácil de hacer en redis, requiere ajustes en el tamaño de la losa en memcached, que tiene sus propios efectos secundarios de rendimiento.
  • Instantáneas sencillas del contenido actual de la caché
  • El clúster de Redis también está listo para producción junto con los controladores de idioma, por lo que la implementación en clúster también es fácil.
DhruvPathak
fuente

Respuestas:

122

La principal razón por la que veo hoy como un caso de uso para memcached sobre Redis es la eficiencia de memoria superior que debería poder obtener con el almacenamiento en caché de fragmentos HTML sin formato (o aplicaciones similares). Si necesita almacenar diferentes campos de sus objetos en diferentes claves memcached, entonces los hash de Redis serán más eficientes en memoria, pero cuando tenga una gran cantidad de pares clave -> cadena simple, memcached debería poder brindarle más elementos por megabyte.

Otras cosas que son buenas cosas sobre Memcached:

  • Es una pieza de código muy simple, por lo que si solo necesita la funcionalidad que proporciona, supongo que es una alternativa razonable, pero nunca la usé en producción.
  • Es multiproceso, por lo que si necesita escalar en una configuración de caja única, es algo bueno y necesita hablar con una sola instancia.

Creo que Redis como caché tiene cada vez más sentido a medida que las personas avanzan hacia el almacenamiento en caché inteligente o cuando intentan preservar la estructura de los datos almacenados en caché a través de las estructuras de datos de Redis.

Comparación entre Redis LRU y Memcached LRU.

Tanto Memcached como Redis no realizan desalojos reales de LRU, sino solo una aproximación de eso.

El desalojo de Memcache es por clase de tamaño y depende de los detalles de implementación de su asignador de bloques. Por ejemplo, si desea agregar un elemento que se ajuste a una clase de tamaño determinada, Memcached intentará eliminar los elementos caducados / no utilizados recientemente en esa clase, en lugar de intentar un intento global de comprender qué es el objeto, independientemente de su tamaño, que es el mejor candidato.

En cambio, Redis intenta elegir un buen objeto como candidato para el desalojo cuando maxmemoryse alcanza el límite, mirando todos los objetos, independientemente de la clase de tamaño, pero solo puede proporcionar un objeto aproximadamente bueno, no el mejor objeto con el mayor inactivo hora.

La forma en que Redis hace esto es muestreando algunos objetos, seleccionando el que estuvo inactivo (sin acceso) durante más tiempo. Desde Redis 3.0 (actualmente en versión beta), el algoritmo se mejoró y también tiene buenos grupos de candidatos en los desalojos, por lo que se mejoró la aproximación. En la documentación de Redis puede encontrar una descripción y gráficos con detalles sobre cómo funciona .

Por qué Memcached tiene una mejor huella de memoria que Redis para cadenas simples -> mapas de cadenas.

Redis es una pieza de software más compleja, por lo que los valores en Redis se almacenan de una manera más similar a los objetos en un lenguaje de programación de alto nivel: tienen tipo asociado, codificación, recuento de referencias para la gestión de la memoria. Esto hace que la estructura interna de Redis sea buena y manejable, pero tiene una sobrecarga en comparación con Memcached, que solo se ocupa de cadenas.

Cuando Redis comienza a ser más eficiente en memoria

Redis puede almacenar pequeños tipos de datos agregados en una forma especial de ahorro de memoria. Por ejemplo, un pequeño Hash de Redis que representa un objeto, se almacena internamente no con una tabla hash, sino como un blob binario único. Por lo tanto, configurar varios campos por objeto en un hash es más eficiente que almacenar N claves separadas en memcached.

En realidad, puede almacenar un objeto en memcached como un solo blob JSON (o codificado en binario), pero a diferencia de Redis, esto no le permitirá obtener o actualizar campos independientes.

La ventaja de Redis en el contexto del almacenamiento en caché inteligente.

Debido a las estructuras de datos de Redis, el patrón habitual que se usa con memcached de destruir objetos cuando se invalida el caché, para volver a crearlo desde la base de datos más tarde, es una forma primitiva de usar Redis.

Por ejemplo, imagine que necesita almacenar en caché las últimas noticias N publicadas en Hacker News para completar la sección "Más reciente" del sitio. Lo que haces con Redis es tomar una lista (limitada a elementos M) con las noticias más recientes insertadas. Si usa otra tienda para sus datos y Redis como caché, lo que debe hacer es llenar ambas vistas (Redis y DB) cuando se publica un nuevo elemento. No hay invalidación de caché.

Sin embargo, la aplicación siempre puede tener lógica de modo que si la lista de Redis se encuentra vacía, por ejemplo después de un inicio, la vista inicial se puede volver a crear desde la base de datos.

Al usar el almacenamiento en caché inteligente, es posible realizar el almacenamiento en caché con Redis de una manera más eficiente en comparación con memcached, pero no todos los problemas son adecuados para este patrón. Por ejemplo, el almacenamiento en caché de fragmentos HTML puede no beneficiarse de esta técnica.

antirez
fuente
Gracias Antirez el creador. Pero ** ¿por qué la huella de memoria de Redis para cadenas simples es mayor que la de memcached? ** ¿Es la compresión un factor? ¿O Redis almacena algunos otros datos adicionales cuando se usa un SET para almacenar una cadena simple? Sería genial si pudiera incluir esta información en la respuesta.
DhruvPathak
3
Intenté mejorar la respuesta. Gracias por los comentarios.
antirez
3
Otro aspecto de la "inteligencia" mencionada anteriormente, o el aprovechamiento de los tipos de datos de Redis y la lógica del lado del servidor a través de operaciones y / o scripts, es que ahorra tanto en la complejidad de la aplicación como en la red (como lo discutió @antirez en antirez. com / news / 73 y Yiftach en redislabs.com/blog/the-proven-redis-performance ).
Itamar Haber
1
Antirez gracias por la respuesta. Otra razón podría ser que Memcached es un poco más rápido. También es un software antiguo y muchos marcos lo admiten de forma predeterminada
Nick
3
Excelente respuesta, me encanta lo dedicado que es el padre de Redis con la comunidad.
Mahn
13

Los hábitos son difíciles de romper :)

Sin embargo, en serio, hay dos razones principales, a mi entender, por las que Memcached todavía se usa:

  1. Legacy: hay desarrolladores que se sienten cómodos y familiarizados con Memcached, así como aplicaciones que lo admiten. Esto también significa que es una tecnología madura y bien probada.
  2. Escalado: Memcached estándar es fácilmente escalable horizontalmente, mientras que Redis (hasta y excluyendo la versión 3 que pronto se lanzará) requiere más trabajo para ese fin (es decir, fragmentación).

Sin embargo:

  1. Re. Legacy: dada la solidez de Redis (estructuras de datos, comandos, persistencia ...), que se está desarrollando activamente y clientes en todos los lenguajes imaginables, generalmente se desarrollan nuevas aplicaciones con él.
  2. Reescalado: además de la próxima versión 3, existen soluciones que pueden facilitar el escalado. Por ejemplo, Redis Cloud ofrece un escalado perfecto sin pérdida de datos ni interrupción del servicio. Otro enfoque popular para escalar / fragmentar Redis es twemproxy .
Itamar Haber
fuente
1
Solo una nota: como lo confirmó el mantenedor actual en Twitter, Memcached todavía se desarrolla / mantiene activamente. Supongo que el hecho de que no agregue cosas nuevas a menudo se debe a la madurez que alcanzó el proyecto y la falta de voluntad para agregar cosas nuevas, por lo que los nuevos desarrollos se centran en optimizaciones / correcciones.
antirez
1
TIL que Memcached todavía está vivo y coleando - edité mi respuesta / ty antirez & dormando
Itamar Haber
1
El hash consistente sigue siendo un modelo más sólido para fallas agradables que la fragmentación de Redis para un escenario de caché puro. A medida que caen los nodos, las claves de caché se mueven automáticamente a otros servidores. Mientras tenga un solo servidor, su caché seguirá funcionando, a diferencia de redis, donde si pierde el maestro y el esclavo para cualquier grupo hash, su clúster falla.
Usman Ismail
1
RedisLabs es excelente. Es una tecnología clave detrás de Userify Cloud.
fatal_error
1
También sospecho mucho de cualquier implementación que no sea multiproceso ni basada en bucles de eventos. ... Bien, ahora, ¿dónde están todos los apologistas del rendimiento presentes? Ya preparé su cena. Ahora redis podría hacer eso, y yo sería mucho más pro-redis desde el lado del sistema. Sin embargo, en este punto, a menos que el grupo de desarrollo sea inusualmente capaz de almacenar en caché, memcached es una implementación simple y más eficiente ... las funciones NUNCA son gratuitas, no deje que los apologistas le digan que lo son, o que sus costos son insignificantes.
JM Becker