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

¿Memcached o Redis?

Resumen (TL;DR)

Actualizado el 3 de junio de 2017

Redis es más potente, más popular y mejor soportado que Memcached. Memcached solo puede hacer una pequeña fracción de las cosas que puede hacer Redis. Redis es mejor incluso cuando sus funciones se superponen.

Para cualquier cosa nueva, use Redis.

Memcached vs Redis:comparación directa

Ambas herramientas son almacenes de datos potentes, rápidos 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 usan para lo mismo, así es como se comparan usando los "Puntos a considerar" de la pregunta original:

  • Velocidad de lectura/escritura :Ambos son extremadamente rápidos. Los puntos de referencia varían según la carga de trabajo, las versiones y muchos otros factores, pero generalmente muestran que Redis es tan rápido o casi tan rápido como Memcached. Recomiendo redis, pero no porque memcached sea lento. No lo es.
  • Uso de memoria :Redis es mejor.
    • memcached:usted especifica el tamaño de la memoria caché y, a medida que inserta elementos, el daemon crece rápidamente hasta un poco más de este tamaño. En realidad, nunca hay una manera de recuperar nada de ese espacio, a menos que reinicie Memcached. Todas sus claves podrían estar caducadas, podría vaciar la base de datos y aún usaría la porción completa de RAM con la que la 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.
    • Almacené 100 000 cadenas de ~2 KB (~200 MB) de oraciones aleatorias en ambos. El uso de RAM de Memcached aumentó a ~225 MB. El uso de Redis RAM creció a ~228 MB. Después de vaciar ambos, Redis se redujo a ~29 MB y Memcached permaneció en ~225 MB. Son igualmente eficientes en la forma en que almacenan datos, pero solo uno es capaz de recuperarlos.
  • Volcado de E/S de disco :Una clara victoria para redis ya que hace esto de forma predeterminada y tiene una persistencia muy configurable. Memcached no tiene mecanismos para volcar en disco sin herramientas de terceros.
  • Escalado :Ambos le brindan toneladas de espacio libre antes de que necesite más de una sola instancia como caché. Redis incluye herramientas para ayudarlo a ir más allá, mientras que Memcached no lo hace.

memcaché

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

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 reinicias Memcached, tus datos desaparecen. Esto está bien para un caché. No debes almacenar nada importante allí.

Si necesita alto rendimiento o 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é. También puede almacenar pares clave/valor. En redis pueden llegar a tener hasta 512 MB.

Puede desactivar la persistencia y felizmente también perderá sus datos al reiniciar. Si desea que su caché sobreviva a los reinicios, también le permite hacerlo. De hecho, ese es el valor predeterminado.

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

Si una instancia de redis/memcached no es suficiente rendimiento para su carga de trabajo, redis es la opción clara. Redis incluye compatibilidad con clústeres 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 líder indiscutible en herramientas de terceros. Empresas como Redis Labs, Amazon y otras ofrecen muchas herramientas y servicios útiles de redis. El ecosistema alrededor de redis es mucho más grande. Es probable que ahora la cantidad de implementaciones a gran escala sea mayor que la de Memcached.

La superserie Redis

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é de clave/valor como Memcached. La mayoría de las características de redis son cosas que memcached no puede 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 recurso fantástico de fácil navegación. Te permite probar redis en el navegador e incluso te brinda ejemplos interactivos en vivo con cada comando en los documentos.

Ahora hay el doble de resultados de stackoverflow para redis que memcached. El doble de resultados de Google. Ejemplos más fácilmente accesibles en más idiomas. Desarrollo más activo. Desarrollo de clientes más activo. Es posible que estas medidas no signifiquen mucho individualmente, pero en combinación muestran una imagen clara de que el soporte y la documentación para redis son mayores y mucho más actualizados.

Persistencia

De forma predeterminada, Redis conserva sus datos en el disco mediante un mecanismo llamado creación de instantáneas. Si tiene suficiente 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 bloqueo repentino resulte en una pequeña cantidad de datos perdidos. Si absolutamente necesita asegurarse de que nunca se pierdan datos, no se preocupe, redis también lo respalda con el modo AOF (Anexar solo archivo). En este modo de persistencia, los datos se pueden sincronizar con el disco a medida que se escriben. Esto puede reducir el rendimiento de escritura máximo a lo rápido que puede escribir su disco, pero aún así debería ser bastante rápido.

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

Muchos tipos de datos

Memcached se limita a cadenas, pero Redis es un servidor de estructura de datos que puede servir 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 que comparten Redis y Memcached, aunque las cadenas de Memcached están limitadas a 1 MB.

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, compatibilidad con incrementos/decrementos de punto flotante, consultas de rango y operaciones de múltiples claves. Memcached no admite nada de eso.

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

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 campos de cadena y valores de cadena. Los mapas de campo->valor que usan un hash son un poco más eficientes en espacio que los mapas de clave->valor que usan cadenas regulares.

Los hashes son útiles como espacio de nombres o cuando desea agrupar lógicamente muchas claves. Con un hash, puede capturar todos los miembros de manera eficiente, hacer que caduquen todos los miembros juntos, eliminar todos los miembros juntos, etc. Ideal para cualquier caso de uso en el que tenga varios pares clave/valor que necesiten agruparse.

Un ejemplo de uso de un hash es para almacenar perfiles de usuario entre aplicaciones. Un hash redis almacenado con la identificación del usuario como clave le permitirá almacenar tantos bits de datos sobre un usuario como sea necesario mientras los mantiene almacenados bajo una sola clave. La ventaja de usar un hash en lugar de serializar el perfil en una cadena es que puede hacer que diferentes aplicaciones lean/escriban diferentes campos dentro del perfil de usuario sin tener que preocuparse de que una aplicación anule los cambios realizados por otras (lo que puede suceder si serializa datos).

Listas (comandos)

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

Redis proporciona muchos comandos para aprovechar las listas, incluidos los comandos para empujar/abrir elementos, empujar/abrir entre listas, truncar listas, realizar consultas de rango, etc.

Las listas son excelentes colas duraderas y atómicas. Estos 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 un valor está en el conjunto, agregar o 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 programación tienen algo similar (generalmente llamado Conjunto). Esto es así, solo distribuido.

Redis proporciona varios comandos para administrar conjuntos. Los obvios como agregar, quitar y verificar el conjunto están presentes. También lo son los comandos menos obvios, como hacer estallar/leer un elemento aleatorio y los 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 partitura, luego lexicográficamente.

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

Si agrega usuarios a un conjunto ordenado junto con su puntuación más alta, tiene una tabla de clasificación perfecta. A medida que ingresen nuevos puntajes altos, simplemente agréguelos al conjunto nuevamente con su puntaje alto y reordenará su tabla de clasificación. También es excelente para realizar un seguimiento de la última vez que los usuarios visitaron y quién está activo en su aplicación.

Almacenar valores con la misma puntuación hace que se ordenen lexicográficamente (piense en orden alfabético). Esto puede ser útil para cosas como funciones de autocompletar.

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

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 en conjuntos ordenados, por lo que este no es un tipo de datos realmente separado. Es más una extensión sobre los conjuntos ordenados.

Mapa de bits e 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 fueran un mapa de bits o un hiperloglog.

Los mapas de bits son los operadores de nivel de bits a los que hice referencia en Strings son para. Este tipo de datos fue el bloque de construcción básico para el reciente proyecto de arte colaborativo de reddit:r/Place.

HyperLogLog le permite usar una cantidad de espacio extremadamente pequeña constante para contar valores únicos casi ilimitados con una precisión sorprendente. Usando solo ~ 16 KB, podría contar de manera eficiente la cantidad de visitantes únicos a su sitio, incluso si esa cantidad 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 en redis, ese valor será visible para todos los clientes conectados a redis. No hay que 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 también son atómicos.

Si bien no es lo mismo que las transacciones en bases de datos relacionales, redis también tiene transacciones que usan "bloqueo optimista" (WATCH/MULTI/EXEC).

Conducción

Redis proporciona una característica llamada 'canalización'. Si tiene muchos comandos de Redis que desea ejecutar, puede usar la canalización para enviarlos a Redis todos a la vez en lugar de uno a la vez.

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

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

Publicación/suscripción

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

Redis hace pub/sub tan bien como casi cualquier herramienta. Los intermediarios de mensajes dedicados como RabbitMQ pueden tener ventajas en ciertas áreas, pero el hecho de que el mismo servidor también pueda brindarle colas persistentes y duraderas y otras estructuras de datos que probablemente necesiten sus cargas de trabajo de publicación/suscripción, a menudo demostrará que Redis es la mejor y más sencilla herramienta. para el trabajo.

Secuencias de comandos de Lua

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

Tal vez tenga cálculos complejos que desee que realice Redis. Tal vez no pueda darse el lujo de que sus transacciones retrocedan y necesite garantías de que cada paso de un proceso complejo sucederá de forma atómica. Estos problemas y muchos más se pueden resolver con lua scripting.

La secuencia de comandos completa se ejecuta atómicamente, por lo que si puede ajustar su lógica en una secuencia de comandos lua, a menudo puede evitar meterse con transacciones de bloqueo optimistas.

Escalado

Como se mencionó anteriormente, redis incluye soporte integrado para la agrupación en clústeres 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 proyecto existente que aún no use memcached.

Lo anterior puede parecer que no me gusta Memcached. Al contrario:es una herramienta poderosa, simple, estable, madura y endurecida. Incluso hay algunos casos de uso en los que es un poco más rápido que redis. Me encanta 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 que Redis será más rápido, y muchas más cargas de trabajo que Redis puede hacer y 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 muy bien pueden ser la última pieza de su infraestructura de la 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, siga usándolo, si satisface sus necesidades. Es probable que no valga la pena el esfuerzo de pasar a redis y si va a usar redis solo para el almacenamiento en caché, es posible que no ofrezca suficientes beneficios para que valga la pena. Si memcached no satisface sus necesidades, entonces probablemente debería cambiarse a redis. Esto es así tanto si necesita escalar más allá de Memcached como si necesita una funcionalidad adicional.