Memcached vs. Redis?

Estamos usando una aplicación web Ruby con el servidor Redis para el almacenamiento en caché. ¿Hay algún punto para probar Memcached en su lugar?

¿Qué nos dará un mejor rendimiento? ¿Algún pros o contras entre Redis y Memcached?

Puntos a considerar:

  • Velocidad de lectura / escritura.
  • Uso de memoria.
  • Volcado de E / S de disco.
  • Escalada.

Resumen (TL; DR)

Actualizado el 3 de junio de 2017

Redis es más poderoso, más popular y está mejor respaldado que memcached. Memcached solo puede hacer una pequeña fracción de las cosas que Redis puede hacer. Redis es mejor incluso cuando sus características se superponen.

Para cualquier cosa nueva, usa Redis.

Memcached vs Redis: comparación directa

Ambas herramientas son tiendas de datos potentes, rápidas y en memoria que son útiles como caché. Ambos pueden ayudar a acelerar su aplicación almacenando en caché los resultados de la base de datos, fragmentos de HTML o cualquier otra cosa que pueda ser costosa de generar.

Puntos a considerar

Cuando se usa para lo mismo, aquí es cómo se comparan usando la pregunta original “Puntos a considerar”:

  • Velocidad de lectura / escritura : ambas son extremadamente rápidas. Los puntos de referencia varían según la carga de trabajo, las versiones y muchos otros factores, pero generalmente muestran que los redis son tan rápidos o casi tan rápidos como los memcached. Recomiendo Redis, pero no porque la memcached sea lenta. No es.
  • Uso de la memoria : Redis es mejor.
    • memcached: especifica el tamaño de la memoria caché y, a medida que inserta elementos, el daemon crece rápidamente a un poco más de este tamaño. En realidad, nunca hay una manera de recuperar ninguno de esos espacios, salvo el reinicio de memcached. Todas sus claves podrían haber caducado, podría vaciar la base de datos y aún así usaría la cantidad total de RAM que configuró.
    • redis: establecer un tamaño máximo depende de usted. Redis nunca usará más de lo necesario y le devolverá la memoria que ya no usa.
    • Almacenaba cadenas de 100,000 ~ 2KB (~ 200MB) de oraciones aleatorias en ambos. El uso de Memcached RAM creció a ~ 225MB. El uso de Redis RAM creció a ~ 228MB. Después de enjuagar ambos, redis bajó a ~ 29MB y memcached se mantuvo en ~ 225MB. Son igualmente eficientes en la forma en que almacenan los datos, pero solo uno es capaz de reclamarlos.
  • Volcado de E / S de disco : una victoria clara para redis ya que lo hace de forma predeterminada y tiene una persistencia muy configurable. Memcached no tiene mecanismos para volcar en el disco sin herramientas de terceros.
  • Escalado : ambos te dan toneladas de margen antes de necesitar más de una instancia como caché. Redis incluye herramientas para ayudarlo a ir más allá mientras que memcached no lo hace.

memcached

Memcached es un simple servidor de caché volátil. Le permite almacenar pares clave / valor donde el valor está limitado a ser una cadena de hasta 1MB.

Es bueno en esto, pero eso es todo lo que hace. Puede acceder a esos valores por su clave a una velocidad extremadamente alta, a menudo saturando la red disponible o incluso el ancho de banda de la memoria.

Cuando reinicia memcached, sus datos desaparecen. Esto está bien para un caché. No debe almacenar nada importante allí.

Si necesita un alto rendimiento o una alta disponibilidad, existen herramientas, productos y servicios de terceros disponibles.

redis

Redis puede hacer los mismos trabajos que memcached y puede hacerlo mejor.

Redis también puede actuar como un caché . Puede almacenar pares clave / valor también. En redis pueden incluso ser de hasta 512MB.

Puede desactivar la persistencia y también perderá sus datos cuando reinicie. Si quieres que tu caché sobreviva, se reinicia y te permite hacer eso también. De hecho, ese es el valor predeterminado.

También es superrápido, a menudo limitado por el ancho de banda de la red o la memoria.

Si una instancia de redis / memcached no es suficiente para su carga de trabajo, redis es la opción más clara. Redis incluye soporte de clúster y viene con herramientas de alta disponibilidad ( redis-sentinel ) directamente “en la caja”. En los últimos años, redis también se ha convertido en el claro líder en herramientas de terceros. Empresas como Redis Labs, Amazon y otras ofrecen muchas herramientas y servicios redis útiles. El ecosistema alrededor de redis es mucho más grande. La cantidad de implementaciones a gran escala ahora es mayor que la de memcached.

The Redis Superset

Redis es más que un caché. Es un servidor de estructura de datos en memoria. A continuación encontrará una descripción general rápida de las cosas que Redis puede hacer más allá de ser un simple caché clave / valor como memcached. La mayoría de las funciones de redis son cosas que los memcached no pueden hacer.

Documentación

Redis está mejor documentado que memcached. Si bien esto puede ser subjetivo, parece ser cada vez más cierto todo el tiempo.

redis.io es un fantástico recurso de fácil navegación. Le permite intentar redis en el navegador e incluso le ofrece ejemplos interactivos en vivo con cada comando en los documentos.

Ahora hay 2x tantos resultados de stackoverflow para redis como memcached. 2x tantos resultados de Google. Ejemplos más fácilmente accesibles en más idiomas. Un desarrollo más activo. Desarrollo de cliente más activo. Estas mediciones pueden no significar mucho de forma individual, pero en combinación muestran una imagen clara de que el soporte y la documentación para redis es mayor y mucho más actualizado.

Persistencia

Por defecto, redis persiste en tus datos en el disco mediante un mecanismo llamado snapshotting. Si tiene suficiente memoria RAM disponible, puede escribir todos sus datos en el disco casi sin degradación del rendimiento. ¡Es casi gratis!

En el modo de instantánea, existe la posibilidad de que un locking repentino provoque una pequeña cantidad de datos perdidos. Si necesita asegurarse de que no se pierda ningún dato, no se preocupe, el redis también lo respalda con el modo AOF (Append Only File). En este modo de persistencia, los datos se pueden sincronizar en el disco tal como está escrito. Esto puede reducir el rendimiento máximo de escritura por rápido que el disco pueda escribir, pero aún así debe ser bastante rápido.

Hay muchas opciones de configuración para ajustar la persistencia si lo necesita, pero los valores predeterminados son muy razonables. Estas opciones facilitan la configuración de redis como un lugar seguro y redundante para almacenar datos. Es una base de datos real .

Muchos tipos de datos

Memcached está limitado a cadenas, pero Redis es un servidor de estructura de datos que puede servir para muchos tipos de datos diferentes. También proporciona los comandos que necesita para aprovechar al máximo esos tipos de datos.

Cadenas ( comandos )

Texto simple o valores binarios que pueden tener un tamaño de hasta 512 MB. Este es el único tipo de datos redis y memcached share, aunque las cadenas memcached están limitadas a 1MB.

Redis le brinda más herramientas para aprovechar este tipo de datos al ofrecer comandos para operaciones bit a bit, manipulación a nivel de bit, soporte de incremento / decremento de coma flotante, consultas de rango y operaciones de múltiples teclas. Memcached no admite nada de eso.

Las cadenas son útiles para todo tipo de casos de uso, por lo que memcached es bastante útil con este tipo de datos solo.

Hashes ( comandos )

Los hashes son algo así como un almacén de valores clave dentro de un almacén de valores clave. Se asignan entre los campos de cadena y los valores de cadena. Los mapas de valores de campo usando un hash son ligeramente más eficientes en cuanto a espacio que los mapas de clave y valor usando cadenas regulares.

Los hashes son útiles como espacio de nombres, o cuando se quiere agrupar lógicamente muchas claves. Con un hash puede agarrar a todos los miembros de manera eficiente, caducar todos los miembros, eliminar todos los miembros, etc. Ideal para cualquier caso de uso donde tenga varios pares clave / valor que deben agruparse.

Un ejemplo de uso de un hash es para almacenar perfiles de usuario entre aplicaciones. Un hash redis almacenado con el ID de usuario, ya que la clave le permitirá almacenar tantos bits de datos sobre un usuario como sea necesario mientras los mantiene almacenados en una sola clave. La ventaja de utilizar un hash en lugar de serializar el perfil en una cadena es que puede tener diferentes aplicaciones para leer / escribir diferentes campos dentro del perfil de usuario sin tener que preocuparse de que una aplicación anule los cambios realizados por otros (lo que puede ocurrir si serializa obsoleta) datos).

Listas ( comandos )

Las listas de Redis son colecciones ordenadas de cadenas. Están optimizados para insertar, leer o eliminar valores de la parte superior o inferior (también conocido como: izquierda o derecha) de la lista.

Redis proporciona muchos comandos para aprovechar las listas, incluidos los comandos para empujar / mostrar elementos, presionar / pasar de una lista a otra, truncar listas, realizar consultas de rango, etc.

Las listas son excelentes colas duraderas y atómicas. Funcionan muy bien para colas de trabajos, registros, búferes y muchos otros casos de uso.

Conjuntos ( comandos )

Los conjuntos son colecciones desordenadas de valores únicos. Están optimizados para permitirle verificar rápidamente si hay un valor en el conjunto, agregar / eliminar valores rápidamente y medir la superposición con otros conjuntos.

Estos son excelentes para cosas como listas de control de acceso, rastreadores de visitantes únicos y muchas otras cosas. La mayoría de los lenguajes de progtwigción tienen algo similar (generalmente llamado conjunto). Esto es así, solo distribuido.

Redis proporciona varios comandos para administrar conjuntos. Los obvios como agregar, eliminar y verificar el conjunto están presentes. Entonces, hay comandos menos obvios como abrir / leer un elemento al azar y comandos para realizar uniones e intersecciones con otros conjuntos.

Conjuntos ordenados ( comandos )

Los conjuntos ordenados también son colecciones de valores únicos. Estos, como su nombre lo indica, están ordenados. Se ordenan por puntaje, luego lexicográficamente.

Este tipo de datos está optimizado para búsquedas rápidas por puntaje. Obtener el rango más alto, más bajo o cualquier rango de valores es extremadamente rápido.

Si agrega usuarios a un conjunto ordenado junto con su puntaje más alto, usted mismo tiene una tabla de clasificación perfecta. A medida que ingresen los puntajes más altos, solo agréguelos al set de nuevo con su puntaje más alto y reordenará su tabla de líderes. También es ideal para realizar un seguimiento de la última vez que los usuarios visitaron y quién está activo en su aplicación.

Almacenar valores con el mismo puntaje hace que se ordenen lexicográficamente (piense alfabéticamente). Esto puede ser útil para cosas como funciones de autocompletar.

Muchos de los comandos de conjunto ordenados son similares a los comandos para conjuntos, a veces con un parámetro de puntuación adicional. También se incluyen comandos para administrar los puntajes y consultar por puntaje.

Geo

Redis tiene varios comandos para almacenar, recuperar y medir datos geográficos. Esto incluye consultas de radio y medición de distancias entre puntos.

Técnicamente, los datos geográficos en redis se almacenan dentro de conjuntos ordenados, por lo que este no es un tipo de datos verdaderamente separado. Es más una extensión sobre los conjuntos ordenados.

Bitmap y HyperLogLog

Al igual que geo, estos no son tipos de datos completamente separados. Estos son comandos que le permiten tratar datos de cadena como si fuera un bitmap o un hiperlogálogo.

Los bitmaps son para lo que los operadores de nivel de bit a los que hice referencia en Strings son para. Este tipo de datos fue el componente básico para el proyecto de arte colaborativo reciente de reddit: r / Place .

HyperLogLog le permite utilizar una cantidad de espacio constante extremadamente pequeña para contar valores únicos casi ilimitados con una precisión asombrosa. Con tan solo ~ 16KB, puede contar eficazmente el número de visitantes únicos a su sitio, incluso si ese número es de millones.

Transacciones y atomicidad

Los comandos en redis son atómicos, lo que significa que puede estar seguro de que tan pronto como escriba un valor para redistribuir, ese valor estará visible para todos los clientes conectados a redis. No hay esperar a que ese valor se propague. Técnicamente, Memcached también es atómico, pero con redis agregando toda esta funcionalidad más allá de memcached, vale la pena señalar y algo impresionante que todos estos tipos de datos y características adicionales son también atómicos.

Aunque no es exactamente lo mismo que las transacciones en bases de datos relacionales, redis también tiene transacciones que usan “locking optimista” ( WATCH / MULTI / EXEC ).

Pipelining

Redis proporciona una función llamada ‘ pipelining ‘. Si tiene muchos comandos redis que desea ejecutar, puede usar pipelining para enviarlos a redis all-at-once en vez de one-a-time.

Normalmente, cuando ejecuta un comando para redis o memcached, cada comando es un ciclo de solicitud / respuesta por separado. Con pipelining, redis puede almacenar varios comandos y ejecutarlos todos a la vez, respondiendo con todas las respuestas a todos sus comandos en una sola respuesta.

Esto puede permitirle obtener un rendimiento aún mayor en la importación masiva u otras acciones que implican muchos comandos.

Pub / Sub

Redis tiene comandos dedicados a la funcionalidad de pub / sub , lo que permite a redis actuar como un emisor de mensajes de alta velocidad. Esto permite que un único cliente publique mensajes a muchos otros clientes conectados a un canal.

Redis hace pub / sub, así como casi cualquier herramienta. Los corredores de mensajes dedicados como RabbitMQ pueden tener ventajas en ciertas áreas, pero el hecho de que el mismo servidor también puede proporcionarle colas persistentes duraderas y otras estructuras de datos que su carga de trabajo de pub / sub probablemente necesite, Redis a menudo será la mejor y más simple herramienta para el trabajo.

Lua Scripting

Puede pensar en guiones lua como el propio SQL de Redis o procedimientos almacenados. Es a la vez más y menos que eso, pero la analogía funciona principalmente.

Tal vez tenga cálculos complejos que quiera redis realizar. Tal vez no pueda darse el lujo de que sus transacciones retrocedan y necesite garantías de que cada paso de un proceso complejo ocurrirá atómicamente. Estos problemas y muchos más se pueden resolver con lua scripting.

Todo el script se ejecuta atómicamente, por lo que si puede ajustar su lógica en un script lua, a menudo puede evitar jugar con transacciones de locking optimistas.

Escalada

Como se mencionó anteriormente, redis incluye soporte integrado para clustering y se incluye con su propia herramienta de alta disponibilidad llamada redis-sentinel .

Conclusión

Sin dudarlo, recomendaría redis sobre memcached para cualquier proyecto nuevo, o proyectos existentes que no usen memcached.

Lo anterior puede sonar como que no me gusta el memcached. Por el contrario: es una herramienta poderosa, simple, estable, madura y reforzada. Incluso hay algunos casos de uso en los que es un poco más rápido que redis. Me encantan los memcached Simplemente no creo que tenga mucho sentido para el desarrollo futuro.

Redis hace todo lo que hace memcached, a menudo mejor. Cualquier ventaja de rendimiento para memcached es menor y específica de la carga de trabajo. También hay cargas de trabajo para las cuales redis será más rápido, y muchas más cargas de trabajo que redis puede hacer que memcached simplemente no puede. Las pequeñas diferencias de rendimiento parecen menores frente a la enorme brecha en la funcionalidad y el hecho de que ambas herramientas son tan rápidas y eficientes que bien pueden ser la última pieza de su infraestructura que tendrá que preocuparse por escalar.

Solo hay un escenario donde memcached tiene más sentido: donde memcached ya está en uso como caché. Si ya está almacenando en caché con memcached, continúe usándolo, si satisface sus necesidades. Es probable que no valga la pena el esfuerzo de pasar a redis y si vas a utilizar redis solo para almacenar en caché, es posible que no ofrezca suficiente beneficio para que valga la pena. Si memcached no satisface tus necesidades, entonces probablemente deberías cambiar a redis. Esto es cierto tanto si necesita escalar más allá de memcached o si necesita funcionalidad adicional.

Use Redis si

  1. Necesita eliminar / caducar selectivamente elementos en la memoria caché. (Necesitas esto)

  2. Necesita la capacidad de consultar claves de un tipo particular. eq. ‘blog1: publicaciones: *’, ‘blog2: categorías: xyz: publicaciones: *’. ¡Oh si! esto es muy importante. Use esto para invalidar ciertos tipos de elementos almacenados en caché de forma selectiva. También puede usar esto para invalidar la memoria caché de fragmentos, la memoria caché de páginas, solo los objetos AR de un tipo determinado, etc.

  3. Persistencia (Necesitarás esto también, a menos que estés de acuerdo con que tu caché tenga que calentarse después de cada reinicio. Muy esencial para objetos que rara vez cambian)

Usa memcached si

  1. ¡Memcached te da dolores de cabeza!
  2. umm … agrupamiento? meh si vas tan lejos, usa Varnish y Redis para almacenar en caché fragmentos y objetos AR.

Desde mi experiencia, he tenido una estabilidad mucho mejor con Redis que con Memcached

Memcached es multiproceso y rápido.

Redis tiene muchas funciones y es muy rápido, pero está completamente limitado a un núcleo, ya que se basa en un ciclo de eventos.

Usamos ambos. Memcached se usa para almacenar objetos en caché, principalmente para reducir la carga de lectura en las bases de datos. Redis se usa para cosas como conjuntos ordenados que son útiles para enrollar datos de series de tiempo.

Esto es demasiado largo para ser publicado como un comentario a la respuesta ya aceptada, así que lo puse como una respuesta separada

También hay que tener en cuenta si espera tener un límite de memoria superior dura en su instancia de caché.

Dado que redis es una base de datos nosql con toneladas de características y el almacenamiento en memoria caché es solo una opción para la que se puede usar, asigna memoria a medida que la necesita: cuantos más objetos coloques en ella, más memoria usará. La opción de maxmemory memoria no impone estrictamente el uso de límite de memoria superior. A medida que trabajas con el caché, las claves se desalojan y expiran; es probable que sus llaves no sean todas del mismo tamaño, por lo que se produce una fragmentación de la memoria interna.

Por defecto, redis utiliza el asignador de memoria jemalloc , que hace lo posible por ser tanto compacto como rápido, pero es un asignador de memoria de propósito general y no puede mantenerse al día con muchas asignaciones y purga de objetos que se producen a gran velocidad. Debido a esto, en algunos patrones de carga, el proceso redis aparentemente puede perder memoria debido a la fragmentación interna. Por ejemplo, si tiene un servidor con 7 Gb RAM y desea utilizar redis como caché LRU no persistente, puede encontrar que el proceso maxmemory con maxmemory configurado a 5Gb con el tiempo usaría más y más memoria, llegando finalmente al límite total de RAM hasta que el asesino fuera de la memoria interfiera.

memcached es un mejor ajuste al escenario descrito anteriormente, ya que administra su memoria de una manera completamente diferente. memcached asigna una gran cantidad de memoria, todo lo que necesitará, y luego gestiona esta memoria por sí mismo, utilizando su propio asignador de placa implementado. Por otra parte, memcached se esfuerza por mantener baja la fragmentación interna, ya que en realidad utiliza el algoritmo LRU por placa , cuando los desalojos LRU se realizan con el tamaño del objeto considerado.

Dicho esto, Memcached todavía tiene una posición fuerte en entornos, donde el uso de la memoria debe hacerse cumplir y / o ser predecible. Hemos intentado utilizar el último redis estable (2.8.19) como un reemplazo de memcached no persistente basado en LRU en la carga de trabajo de 10-15k op / s, y ha filtrado MUCHA memoria; la misma carga de trabajo estaba bloqueando las instancias ElastiCache redis de Amazon en aproximadamente un día por las mismas razones.

Memcached es bueno para ser un simple almacén de claves / valores y es bueno para hacer key => STRING. Esto lo hace realmente bueno para el almacenamiento de la sesión.

Redis es bueno haciendo key => SOME_OBJECT.

Realmente depende de lo que vas a poner allí. Entiendo que en términos de rendimiento son bastante parejos.

También buena suerte para encontrar puntos de referencia objectives, si encuentra algún amablemente enviarlos a mi manera.

Si no te importa un estilo de escritura grosero, vale la pena leer Redis vs Memcached en el blog de Systoilet desde el punto de vista de la usabilidad, pero asegúrate de leer los comentarios de ida y vuelta antes de sacar conclusiones sobre el rendimiento; hay algunos problemas metodológicos (pruebas de bucle ocupado de un solo hilo), y Redis ha realizado algunas mejoras desde que el artículo también fue escrito.

Y no hay un enlace de referencia completo sin confundir un poco las cosas, así que también revise algunos puntos de referencia contradictorios en LiveJournal de Dormondo y el Weblog Antirez .

Editar – como señala Antirez, el análisis de Systoilet está bastante mal concebido. Incluso más allá del déficit de subprocesamiento único, gran parte de la disparidad de rendimiento en esos puntos de referencia se puede atribuir a las bibliotecas del cliente en lugar del rendimiento del servidor. Los puntos de referencia en el Antirez Weblog sí presentan una comparación mucho más de manzanas con manzanas (con la misma boca).

Tuve la oportunidad de usar tanto memcached como redis juntos en el proxy de almacenamiento en caché en el que he trabajado, permítanme compartir dónde exactamente he usado qué y razonar detrás de eso …

Redis>

1) Se utiliza para indexar el contenido de la memoria caché, sobre el clúster. Tengo más de mil millones de claves en racimos redis, los tiempos de respuesta del redis son bastante menos estables.

2) Básicamente, es una tienda clave / valor, así que siempre que tengas algo similar en tu aplicación, puedes usar redis para molestar mucho.

3) Redis persistency, failover y backup (AOF) facilitarán su trabajo.

Memcache>

1) sí, una memoria optimizada que se puede usar como caché. Lo usé para almacenar el contenido de caché accediendo con mucha frecuencia (con 50 hits / segundo) con tamaño inferior a 1 MB.

2) Asigné solo 2GB de 16 GB para memcached también cuando mi tamaño de contenido único era> 1MB.

3) A medida que el contenido crece cerca de los límites, ocasionalmente he observado tiempos de respuesta más altos en las estadísticas (no en el caso de redis).

Si solicita una experiencia global, Redis es mucho más ecológico ya que es fácil de configurar, muy flexible con características robustas y estables.

Además, hay un resultado de evaluación comparativa disponible en este enlace , a continuación se muestran algunos resultados destacados de la misma,

enter image description here

enter image description here

¡¡Espero que esto ayude!!

Otra ventaja es que puede ser muy claro cómo se comportará Memcache en un escenario de almacenamiento en caché, mientras que Redis se usa generalmente como un almacén de datos persistente, aunque puede configurarse para comportarse como Memcached aka desalojar los artículos menos usados ​​recientemente cuando alcanza el máximo capacidad.

Algunas aplicaciones en las que he trabajado usan solo para aclarar cómo queremos que se comporten los datos: cosas en Memcache, escribimos código para manejar los casos donde no está allí, cosas en redis, confiamos en que esté ahí. .

Aparte de eso, Redis generalmente se considera superior para la mayoría de los casos de uso, ya que son más ricos en funciones y, por lo tanto, más flexibles.

Prueba. Ejecuta algunos puntos de referencia simples. Durante mucho tiempo me consideré un rinoceronte de la vieja escuela, ya que usaba principalmente memcached y consideraba a Redis como el niño nuevo.

Con mi compañía actual, Redis se usó como el caché principal. Cuando profundicé en algunas estadísticas de rendimiento y simplemente comencé a probar, Redis era, en términos de rendimiento, comparable o mínimamente más lenta que MySQL.

Memcached, aunque simplista, sacó a Redis totalmente del agua. Se escalo mucho mejor:

  • para valores más grandes (cambio requerido en el tamaño de la losa, pero funcionó)
  • para múltiples solicitudes concurrentes

Además, en mi opinión, la política de desahucio de memcached es mucho mejor implementada, lo que da como resultado un tiempo de respuesta promedio global más estable al manejar más datos de los que la caché puede manejar.

Algunos puntos de referencia revelaron que Redis, en nuestro caso, funciona muy mal. Esto creo que tiene que ver con muchas variables:

  • tipo de hardware que ejecuta Redis en
  • tipos de datos que almacena
  • cantidad de get y sets
  • qué tan concurrente es tu aplicación
  • necesitas almacenamiento de estructura de datos

Personalmente, no comparto la vista que los autores de Redis tienen sobre concurrencia y multihilo.

No estaría mal, si decimos que redis es una combinación de (caché + estructura de datos) mientras que memcached es solo un caché.

Una diferencia importante que no se ha señalado aquí es que Memcache tiene un límite de memoria superior en todo momento, mientras que Redis no lo hace de forma predeterminada (pero se puede configurar). Si siempre desea almacenar una clave / valor por una determinada cantidad de tiempo (y nunca desalojarlo debido a la poca memoria), quiere ir con Redis. Por supuesto, también corre el riesgo de quedarse sin memoria …

Una prueba muy simple para establecer y obtener 100k claves y valores únicos contra redis-2.2.2 y memcached. Ambos se ejecutan en Linux VM (CentOS) y mi código de cliente (pegado a continuación) se ejecuta en el escritorio de Windows.

Redis

  • El tiempo necesario para almacenar 100000 valores es = 18954ms

  • El tiempo necesario para cargar 100000 valores es = 18328 ms

Memcached

  • El tiempo necesario para almacenar 100000 valores es = 797 ms

  • El tiempo necesario para recuperar 100000 valores es = 38984ms


 Jedis jed = new Jedis("localhost", 6379); int count = 100000; long startTime = System.currentTimeMillis(); for (int i=0; i 

Pensamos en Redis como un despegue de carga para nuestro proyecto en el trabajo. Pensamos que al usar un módulo en nginx llamado HttpRedis2Module o algo similar, tendríamos una velocidad asombrosa, pero cuando probamos con una prueba AB, estamos equivocados.

Tal vez el módulo era malo o nuestro diseño, pero era una tarea muy simple y era aún más rápido tomar datos con php y luego rellenarlos en MongoDB. Estamos usando APC como sistema de caché y con ese php y MongoDB. Era mucho más rápido que el módulo nginx Redis.

Mi consejo es que lo pruebes tú mismo, y te mostrará los resultados para tu entorno. Decidimos que usar Redis era innecesario en nuestro proyecto ya que no tendría ningún sentido.

La razón más grande que queda es la especialización.

Redis puede hacer muchas cosas diferentes y un efecto secundario es que los desarrolladores pueden comenzar a usar muchos de esos conjuntos de características diferentes en la misma instancia. Si está utilizando la función LRU de Redis para un caché junto con el almacenamiento de datos duros que NO es LRU, es completamente posible quedarse sin memoria.

Si va a configurar una instancia de Redis dedicada para que se use ÚNICAMENTE como una instancia de LRU para evitar ese escenario en particular, entonces realmente no hay ninguna razón de peso para usar Redis a través de Memcached.

Si necesita un caché LRU confiable “nunca se apaga” … Memcached cumplirá con los requisitos ya que es imposible que se quede sin memoria por diseño y la funcionalidad especializada impide que los desarrolladores intenten convertirlo en algo que pueda poner en peligro eso. Separación simple de preocupaciones.

Redis es mejor Los pros de Redis son,

 1.It has a lot of data storage options such as string , sets , sorted sets , hashes , bitmaps 2.Disk Persistence of records 3.Stored Procedure (LUA acripting) support 4.Can act as a Message Broker using PUB/SUB 

Mientras que Memcache es un sistema de tipo de memoria caché de valores clave en memoria.

  1. No admite varios almacenes de tipos de datos como listas, conjuntos como en redis.
  2. La principal desventaja es que Memcache no tiene persistencia de disco.

Memcached será más rápido si está interesado en el rendimiento, incluso porque Redis implica la creación de redes (llamadas TCP). También internamente Memcache es más rápido.

Redis tiene más características, ya que fue mencionado por otras respuestas.

Bueno, principalmente utilicé ambos con mis aplicaciones, Memcache para almacenar en caché las sesiones y redis para doctrine / orm queries objects. En términos de rendimiento, ambos son casi lo mismo.