Estoy usando memcached para almacenar en caché en mi aplicación Rails 3 a través de la Rails.cache
interfaz 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.
fuente
Respuestas:
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.
fuente
Soy el autor de redis-store , no hay necesidad de usar directamente los comandos de Redis, solo use la
:expires_in
opció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.cache
oI18n
.fuente
:expires_in
. ¿Puede usted ayudar?:expires_in
uso de redis_store, consulte stackoverflow.com/questions/20907247/…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
dalli
gema). 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.
fuente
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
fuente
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.
fuente
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.
fuente