ruby on rails - Redis y Memcache o solo Redis?
ruby-on-rails memcached (6)
Estoy usando memcached para almacenar en caché mi aplicación Rails 3 a través de la sencilla interfaz Rails.cache
y ahora me gustaría hacer algunos procesamientos 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 hay tarifas separadas para usar tanto memcached como redis. ¿Tiene sentido usar ambos o debería migrar a solo usar 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 en su mayoría nuevo para mí, pero entiendo que es persistente por defecto y que las claves no expiran automáticamente de la memoria caché.
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 desventajas específicas 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, ¿se guarda en memoria caché más rápido para el almacenamiento en caché simple?) No he encontrado nada definitivo de ninguna manera.
Consideraría revisar mi respuesta sobre este tema:
Rieles y almacenamiento en caché, ¿es fácil cambiar entre Memcache y Redis?
Básicamente, a través de mi experiencia, recomendaría mantenerlos separados: memcached para almacenamiento en caché y redis para estructuras de datos y almacenamiento más persistente
He visto algunos sitios de rieles grandes que usan tanto Memcached como Redis. Memcached se utiliza para las cosas efímeras que son agradables para mantener caliente en la memoria, pero se pueden perder / regenerar si es necesario, y Redis para el almacenamiento persistente. Ambos se utilizan para tomar una carga de la base de datos principal para leer / escribir operaciones pesadas.
Más detalles:
Memcached: utilizado para el almacenamiento en caché de páginas / fragmentos / respuestas y está bien para alcanzar el límite de memoria en Memcached porque hará que LRU (el que se usó menos) expire las cosas viejas y con frecuencia mantiene las teclas accedidas calientes en la memoria. Es importante que cualquier cosa en Memcached pueda recrearse desde el DB si es necesario (no es su única copia). Pero puede seguir vertiendo cosas en él, y Memcached calculará cuáles se usan con más frecuencia y los mantendrá calientes en la memoria. No tiene que preocuparse por eliminar cosas de Memcached.
redis: lo utiliza para datos que no desea perder, y es lo suficientemente pequeño como para caber en la memoria. Esto generalmente incluye trabajos resque / sidekiq, contadores para limitar la velocidad, resultados de prueba divididos 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 después.
Redis comienza a sufrir problemas de rendimiento una vez que excede su límite de memoria (corríjame si me equivoco). Es posible resolver esto configurando Redis para que actúe como Memcached y expire LRU, por lo que nunca alcanza su límite de memoria. Pero no querrás hacer esto con todo lo que guardas en Redis, como los trabajos de resque. Por lo tanto, en lugar de personas a menudo mantener el valor predeterminado, Rails.cache configurado para usar Memcached (utilizando la gema dalli
). Y luego mantienen una variable global $ redis = ... por separado para hacer 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''])
Puede haber una manera fácil de hacer todo esto en Redis, tal vez teniendo dos instancias separadas de Redis, 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.
Le pregunté al equipo de Redis Labs (que proporciona los complementos de Memcached Cloud y Redis Cloud ) qué productos recomendarían para el almacenamiento en memoria caché de Rails. Dijeron que, en general, recomendarían Redis Cloud, que Memcached Cloud se ofrece principalmente con fines heredados, y señalaron que su servicio Memcached Cloud es, de hecho, construido sobre la Redis Cloud.
No sé para qué los usa, pero usar ambos puede darle una ventaja de rendimiento: Memcached tiene un rendimiento mucho mejor ejecutado en múltiples núcleos que Redis, por lo que almacena en caché los datos más importantes con Memcached y guarda el resto en Redis , aprovechando sus capacidades como base de datos, podría aumentar el rendimiento.
Soy el autor de redis-store , no hay necesidad de usar directamente los comandos de Redis, simplemente use la opción :expires_in
como esta:
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
La ventaja de usar Redis es la solidez, y con mi joya, es que ya tienes tiendas para Rack::Cache
, Rails.cache
o I18n
.
Suponiendo que migrar de memcached a redis para el almacenamiento en caché que ya hace es bastante fácil, iría con redis solo para mantener las cosas simples.
En Redis, la persistencia es opcional, por lo que puede usarla de forma similar a memcached si eso es lo que desea. Incluso puede descubrir que hacer que su caché sea persistente es útil para evitar muchos errores de caché después de un reinicio. El vencimiento también está disponible: el algoritmo es un poco diferente al de memcached, pero no lo suficiente como para la mayoría de los propósitos; consulte http://redis.io/commands/expire para obtener más información.