¿Redis y Memcache o solo Redis?

85

Estoy usando memcached para almacenar en caché en mi aplicación Rails 3 a través de la Rails.cacheinterfaz simple y ahora me gustaría hacer un procesamiento de trabajo en segundo plano con redis y resque.

Creo que son lo suficientemente diferentes como para justificar el uso de ambos. Sin embargo, en heroku, existen tarifas separadas para usar memcached y redis. ¿Tiene sentido usar ambos o debería migrar para usar solo redis?

Me gusta usar Memcached para el almacenamiento en caché porque las claves utilizadas menos recientemente se eliminan automáticamente del caché y no necesito que los datos del caché persistan. Redis es principalmente nuevo para mí, pero entiendo que es persistente de forma predeterminada y que las claves no caducan de la memoria caché automáticamente.

EDITAR: Solo quería ser más claro con mi pregunta. Sé que es factible usar solo Redis en lugar de ambos. Supongo que solo quiero saber si hay alguna desventaja específica al hacerlo. Teniendo en cuenta tanto la implementación como la infraestructura, ¿hay alguna razón por la que no debería usar Redis? (Es decir, ¿Memcached es más rápido para el almacenamiento en caché simple?) No he encontrado nada definitivo de ninguna manera.

markquezada
fuente
5
Para cualquier otra persona que esté considerando esto: hay un complemento de redis-store para rieles que le permite usar redis como una tienda de caché.
markquezada

Respuestas:

49

Suponiendo que migrar de memcached a redis para el almacenamiento en caché que ya hace es bastante fácil, optaría por redis solo para simplificar las cosas.

En redis, la persistencia es opcional, por lo que puede usarlo de manera similar a memcached si eso es lo que desea. Incluso puede encontrar que hacer que su caché sea persistente es útil para evitar muchos errores de caché después de un reinicio. La expiración también está disponible; el algoritmo es un poco diferente de memcached, pero no lo suficiente como para importar para la mayoría de los propósitos; consulte http://redis.io/commands/expire para obtener más detalles.

Tom Clarkson
fuente
1
Gracias por la respuesta y los documentos relevantes. Edité un poco mi pregunta para que quede más claro lo que estoy buscando. No pensé en la persistencia de la caché después de un reinicio ... esa es una buena característica. (Aunque no estoy seguro de cuán útil es considerando que usaría redis para ir con heroku).
markquezada
1
Si desea mantener algunos elementos efímeros (almacenamiento en caché de fragmentos) y algunos elementos persistentes en redis, ¿necesita crear dos instancias de redis separadas?
Brian Armstrong
1
Si bien usamos Redis tanto para las colas de trabajos como para el caché, los ejecutamos con diferentes configuraciones, específicamente por las razones que indica @BrianArmstrong. El caché es efímero, así que lo configuramos para que sea rápido, pero está bien perder cosas en la memoria y eliminar LRU. Para la cola, realmente no queremos perder trabajos, por lo que la configuramos con persistencia para que sea recuperable.
jwadsack
@jwadsack ¿tienes una publicación donde muestres cómo implementaste esta configuración?
Marklar
1
@Marklar Buena idea. Lo hago ahora: ballardhack.wordpress.com/2015/09/30/…
jwadsack
44

Soy el autor de redis-store , no hay necesidad de usar directamente los comandos de Redis, solo use la :expires_inopción como esta:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

La ventaja de usar Redis es la rapidez y, con mi gema, es que ya tienes tiendas para Rack::Cache, Rails.cacheo I18n.

Luca Guidi
fuente
Gracias por la respuesta Luca. Supongo que puede anular: expires_in directamente cuando necesita almacenar algo de forma persistente. Supongo que la pregunta es realmente sobre el uso de la funcionalidad de tipo memcached y el uso de redis como una tienda persistente junto con la otra.
markquezada
3
No creo que tenga sentido tener memcached y redis al lado, ya que están en el mismo segmento NoSQL: ambos son una tienda k / v. Redis PROS: 1. más rápido que memcached 2. comandos más potentes 3. no se necesita calentamiento de caché 4. útil para resolver otros problemas (por ejemplo, colas con Resque) CONTRAS: 1. necesita una gema externa 2. después de un reinicio, el servidor no acepta comandos mientras lee datos del archivo adjunto Memcached PROS: horneado en Rails CONTRAS: 1. más lento que Redis 2. calentamiento de caché.
Luca Guidi
3
@LucaGuidi Actualmente estoy usando RedisStore para mi caché de Rails. No puedo entender cómo configurar tanto la URL de Redis como la predeterminada :expires_in. ¿Puede usted ayudar?
Chris Vincent
Como yo, si tiene problemas para configurar el :expires_inuso de redis_store, consulte stackoverflow.com/questions/20907247/…
Anirudhan J
19

He visto algunos sitios de rieles grandes que usan Memcached y Redis. Memcached se usa para cosas efímeras que es bueno mantener calientes en la memoria pero que se pueden perder / regenerar si es necesario, y Redis para almacenamiento persistente. Ambos se utilizan para aliviar la carga de la base de datos principal para operaciones pesadas de lectura / escritura.

Más detalles:

Memcached: se usa para el almacenamiento en caché de páginas / fragmentos / respuestas y está bien alcanzar el límite de memoria en Memcached porque LRU (menos usado recientemente) expirará el material antiguo y con frecuencia mantendrá calientes las claves accedidas en la memoria. Es importante que cualquier cosa en Memcached pueda recrearse desde la base de datos si es necesario (no es su única copia). Pero puede seguir volcando cosas en él, y Memcached determinará cuáles se usan con más frecuencia y mantendrá esos elementos calientes en la memoria. No tiene que preocuparse por eliminar cosas de Memcached.

redis: lo usa para datos que no desea perder y es lo suficientemente pequeño como para caber en la memoria. Esto generalmente incluye trabajos de resque / sidekiq, contadores para limitar la velocidad, resultados de pruebas divididas o cualquier cosa que no desee perder / recrear. No desea exceder el límite de memoria aquí, por lo que debe tener un poco más de cuidado con lo que almacena y limpia más tarde.

Redis comienza a sufrir problemas de rendimiento una vez que supera su límite de memoria (corrígeme si me equivoco). Es posible resolver esto configurando Redis para que actúe como Memcached y LRU expira las cosas, por lo que nunca alcanza su límite de memoria. Pero no querrás hacer esto con todo lo que guardas en Redis, como rescatar trabajos. Entonces, en lugar de que la gente a menudo mantenga el valor predeterminado, Rails.cache se configuró para usar Memcached (usando la dalligema). Y luego mantienen una variable global $ redis = ... separada para realizar operaciones redis.

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Podría haber una manera fácil de hacer todo esto en Redis, tal vez al tener dos instancias de Redis separadas, una con un límite de memoria dura LRU, similar a Memcache, y otra para el almacenamiento persistente. No he visto esto usado, pero supongo que sería factible.

Brian Armstrong
fuente
15

Consideraría revisar mi respuesta sobre este tema:

Rails y caché, ¿es fácil cambiar entre Memcache y Redis?

Esencialmente, a través de mi experiencia, abogaría por mantenerlos separados: memcached para almacenamiento en caché y redis para estructuras de datos y almacenamiento más persistente

efalcao
fuente
Aunque inicialmente planeé consolidarlos en función de la respuesta original a mi pregunta, desde entonces he llegado básicamente a la misma conclusión. Estoy usando Memcache para almacenamiento en caché básico y redis para resque.
markquezada
6

Le pregunté al equipo de Redis Labs (que proporciona los complementos Memcached Cloud y Redis Cloud ) sobre qué producto recomendarían para el almacenamiento en caché de Rails. Dijeron que, en general, recomendarían Redis Cloud, que Memcached Cloud se ofrece principalmente para fines heredados, y señalaron que su servicio Memcached Cloud está construido sobre Redis Cloud.

Yarin
fuente
Entonces, ¿no hay necesidad de memcached y redis como se menciona en la respuesta de Brian? "la gente a menudo mantiene el Rails.cache predeterminado configurado para usar memcached (usando la gema dalli). Y luego mantienen una variable global $ redis = ... separada para realizar operaciones redis".
Marklar
4

No sé para qué los está usando, pero en realidad usar ambos puede brindarle una ventaja de rendimiento: Memcached tiene un rendimiento mucho mejor que se ejecuta en múltiples núcleos que Redis, por lo que almacenar en caché los datos más importantes con Memcached y mantener el resto en Redis , aprovechando sus capacidades como base de datos, podría incrementar el rendimiento.

slezica
fuente
1
Eso no es del todo cierto: redis usa múltiples instancias en lugar de múltiples subprocesos, por lo que comparar una instancia de redis de un solo núcleo con una instancia de Memcached de múltiples núcleos no es una prueba particularmente relevante. Además, cuando hay puntos de referencia disponibles que muestran que ambos sistemas son los más rápidos, es poco probable que la diferencia importe en el mundo real.
Tom Clarkson
El enfoque de múltiples procesos de redis se escala mejor en sistemas de múltiples núcleos que el enfoque (predeterminado) de memcached con múltiples subprocesos: antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker
3
Esta gran deficiencia de Redis se minimiza mucho. Si está buscando alta concurrencia y tiene muchos núcleos, Memcached puede ejecutar círculos alrededor de Redis. La fragmentación no es una buena solución, ya que debe implementar hash coherente en su aplicación y no obtendrá una distribución perfecta entre las instancias de Redis. Por ejemplo, si el fragmento A almacena en caché la configuración de su aplicación que se usa en cada solicitud, el fragmento A recibirá más solicitudes que los otros fragmentos que no se activan para cada solicitud.
ColinM