sql >> Base de Datos >  >> NoSQL >> Redis

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

La razón principal 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 simple Almacenamiento en caché de fragmentos HTML (o aplicaciones similares). Si necesita almacenar diferentes campos de sus objetos en diferentes claves de Memcached, entonces los hashes de Redis serán más eficientes con la memoria, pero cuando tenga una gran cantidad de claves -> pares de cadenas simples, Memcached debería poder brindarle más elementos por megabyte.

Otras cosas que son buenas de 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 LRU de Redis y LRU de Memcached.

Tanto Memcached como Redis no realizan desalojos de LRU reales, 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 losa. Por ejemplo, si desea agregar un elemento que se ajuste a una clase de tamaño determinada, Memcached intentará eliminar los elementos vencidos/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 tiempo de inactividad.

La forma en que Redis hace esto es muestreando algunos objetos, eligiendo el que estuvo inactivo (al que no se accedió) durante más tiempo. Desde Redis 3.0 (actualmente en versión beta), se mejoró el algoritmo y también toma buenos grupos de candidatos entre desalojos, por lo que se mejoró la aproximación. En la documentación de Redis puedes encontrar una descripción y gráficos con detalles sobre su funcionamiento.

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 las cadenas.

Cuando Redis comienza a ser más eficiente con la memoria

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

De hecho, 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 N noticias publicadas en Hacker News para completar la sección "Más reciente" del sitio. Lo que hace con Redis es tomar una lista (limitada a M elementos) con las noticias más recientes insertadas. Si usa otra tienda para sus datos y Redis como caché, lo que hace es llenar ambos las vistas (Redis y la base de datos) cuando se publica un nuevo elemento. No hay invalidación de caché.

Sin embargo, la aplicación siempre puede tener una lógica de modo que si se encuentra que la lista Redis está 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.