commands cache caching redis

caching - cache - ¿Es Redis solo un caché?



memcached laravel (5)

He estado leyendo algunos documentos de Redis y probando el tutorial en http://try.redis-db.com/ . Hasta ahora, no veo ninguna diferencia entre Redis y las tecnologías de almacenamiento en caché como Velocity o el Enterprise Library Caching Framework.

Efectivamente, solo está agregando objetos a un almacén de datos en memoria usando una clave única. No parece haber semántica relacional ...

¿Qué me estoy perdiendo?


En realidad, no hay dependencia entre la representación de datos relativa (o cualquier tipo de representación de datos) y el rol de la base de datos (caché, persistencia permanente, etc.).

Redis es bueno para el caché, es cierto, pero es mucho más que un caché. Es una base de datos de alta velocidad totalmente en memoria. Persiste los datos en el disco. No es relacional, es almacenamiento de valor clave.

Lo usamos en producción. Redis nos ayuda a crear un software que maneje miles de solicitudes por segundo y mantenga los datos comerciales del cliente durante todo el ciclo de vida natural.


No sólo un caché.

  • En memoria de almacenamiento de valor-clave
  • Admite múltiples tipos de datos (cadenas, hashes, listas, conjuntos, conjuntos ordenados, mapas de bits e hiperloglogs)
  • Proporciona la capacidad de almacenar datos de caché en el almacenamiento físico (si es necesario).
  • Soporte de modelo pub-sub
  • Redis cache proporciona replicación para alta disponibilidad (maestro / esclavo)

No, Redis es mucho más que un caché.

Como un caché, Redis almacena pares clave = valor. Pero a diferencia de un caché, Redis le permite operar con los valores. Hay 5 tipos de datos en Redis: cadenas, conjuntos, hash, listas y conjuntos ordenados. Cada tipo de datos expone varias operaciones.

La mejor manera de entender a Redis es modelar una aplicación sin pensar en cómo la va a almacenar en una base de datos.

Digamos que queremos construir .com. Para que sea sencillo, necesitamos preguntas, respuestas, etiquetas y usuarios.

Preguntas de modelaje, usuarios y respuestas

Cada objeto puede ser modelado como un mapa. Por ejemplo, una pregunta es un mapa con los campos {id, title, date_asked, votes, ask_by, status}. De manera similar, una Respuesta es un mapa con los campos {id, question_id, answer_text, answer_by, votes, status}. Del mismo modo, podemos modelar un objeto de usuario.

Cada uno de estos objetos se puede almacenar directamente en Redis como un Hash. Para generar identificadores únicos, puede usar el comando de incremento atómico. Algo como esto -

$ HINCRBY unique_ids question 1 (integer) 1 $ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0 OK $ HINCRBY unique_ids answer 1 (integer) 1 $ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1 OK

Cómo manejar los votos

Ahora, cada vez que alguien hace una pregunta o una respuesta, solo tienes que hacer esto.

$ HINCRBY question:1 votes 1 (integer) 1 $ HINCRBY question:1 votes 1 (integer) 2

Lista de preguntas para la página de inicio

A continuación, queremos almacenar las preguntas más recientes para mostrar en la página de inicio. Si estuviera escribiendo un programa .NET o Java, almacenaría las preguntas en una Lista. Resulta que esa es la mejor manera de almacenar esto también en Redis.

Cada vez que alguien hace una pregunta, agregamos su id a la lista.

$ lpush questions question:1 (integer) 1 $ lpush questions question:2 (integer) 1

Ahora, cuando quiere mostrar su página de inicio, le pregunta a Redis las 25 preguntas más recientes.

$ lrange questions 0 24 1) "question:100" 2) "question:99" 3) "question:98" 4) "question:97" 5) "question:96" ... 25) "question:76"

Ahora que tiene los identificadores, recupere los elementos de Redis mediante la canalización y muéstrelos al usuario.

Preguntas por etiquetas, ordenadas por votos

A continuación, queremos recuperar preguntas para cada etiqueta. Pero SO le permite ver las preguntas más votadas, nuevas preguntas o preguntas sin respuesta debajo de cada etiqueta.

Para modelar esto, usamos la función de conjunto ordenado de Redis. Un conjunto ordenado le permite asociar una puntuación a cada elemento. A continuación, puede recuperar elementos en función de sus puntuaciones.

Vamos a seguir adelante y hacer esto para la etiqueta Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 (integer) 1 $ zadd questions_by_votes_tagged:redis 10 question:2 (integer) 1 $ zadd questions_by_votes_tagged:redis 5 question:613 (integer) 1 $ zrange questions_by_votes_tagged:redis 0 5 1) "question:1" 2) "question:613" 3) "question:2" $ zrevrange questions_by_votes_tagged:redis 0 5 1) "question:2" 2) "question:613" 3) "question:1"

¿Qué hicimos aquí? Añadimos preguntas a un conjunto ordenado y asociamos un puntaje (número de votos) a cada pregunta. Cada vez que una pregunta sea votada, iremos incrementando su puntaje. Y cuando un usuario hace clic en "Preguntas etiquetadas como Redis, ordenadas por votos", simplemente hacemos un " zrevrange y recuperamos las preguntas principales.

Preguntas en tiempo real sin actualizar la página

Y, por último, una característica de bonificación. Si mantiene abierta la página de preguntas, SO le notificará cuando se agregue una nueva pregunta. ¿Cómo puede ayudar Redis aquí?

Redis tiene un modelo de pub-sub. Puede crear canales, por ejemplo "channel_questions_tagged_redis". Luego, subscribe usuarios a un canal en particular. Cuando se agrega una nueva pregunta, publish un mensaje en ese canal. Todos los usuarios recibirán el mensaje. Tendrá que usar una tecnología web como sockets o cometas para enviar el mensaje al navegador, pero Redis le ayuda con todas las tuberías del lado del servidor.

Persistencia, fiabilidad, etc.

A diferencia de un caché, Redis conserva los datos en el disco duro. Puede tener una configuración maestro-esclavo para proporcionar una mayor confiabilidad. Para obtener más información, consulte los temas de persistencia y replicación aquí: http://redis.io/documentation


Redis es un caché que se adapta mejor a entornos distribuidos / arquitectura de microservicio.

Es rápido, confiable, proporciona atomicidad y consistencia y tiene una variedad de tipos de datos como conjuntos, hashes, listas, etc.

Lo estoy usando desde el último año y realmente viene como un salvador cuando necesita proporcionar una solución lista para producción muy rápido y para cualquier problema relacionado con el rendimiento, ya que siempre puede usarlo para almacenar datos en caché.


Redis tiene habilidades únicas como lua-scripts ultra rápidos. Su tiempo de ejecución es igual a C comandos de ejecución. Esto también brinda atomicidad para la sofisticada manipulación de datos Redis requerida para el trabajo de muchos objetos avanzados como Locks y Semaphores.

Hay un Redis basado en la cuadrícula de datos de memoria llamado Redisson que permite crear fácilmente aplicaciones distribuidas en Java . Gracias a los objetos distribuidos Lock , Semaphore , ReadWriteLock , CountDownLatch , ConcurrentMap y muchos otros.

Funciona perfectamente en la nube y es compatible con AWS Elasticache , AWS Elasticache Cluster y Azure Redis Cache.