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 maxmemory
se 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.