No, Redis es mucho más que un caché.
Como una 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 Redis es modelar una aplicación sin pensar en cómo la va a almacenar en una base de datos.
Digamos que queremos construir StackOverflow.com. Para que sea simple, necesitamos preguntas, respuestas, etiquetas y usuarios.
Preguntas de modelado, usuarios y respuestas
Cada objeto se puede modelar como un mapa. Por ejemplo, una Pregunta es un mapa con campos {id, título, fecha_preguntas, votos, preguntas_por, estado}. Del mismo modo, una respuesta es un mapa con campos {id, question_id, answer_text, respondido_por, votos, estado}. Del mismo modo, podemos modelar un objeto de usuario.
Cada uno de estos objetos se puede almacenar directamente en Redis como 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
Manejo de votos
Ahora, cada vez que alguien vota una pregunta o una respuesta, solo necesita 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 identificación a la lista.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Ahora, cuando desea renderizar 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 utilizando 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, utilizamos la función Conjunto clasificado de Redis. Un conjunto ordenado le permite asociar una puntuación con cada elemento. Luego puede recuperar elementos en función de sus puntajes.
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 por aquí? Agregamos preguntas a un conjunto ordenado y asociamos un puntaje (número de votos) a cada pregunta. Cada vez que se vota una pregunta, incrementaremos su puntaje. Y cuando un usuario hace clic en "Preguntas etiquetadas Redis, ordenadas por votos", simplemente hacemos una zrevrange
y recuperamos las preguntas principales.
Preguntas en tiempo real sin actualizar la página
Y finalmente, una característica adicional. 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 pub-sub. Puede crear canales, por ejemplo "channel_questions_tagged_redis". Luego, los subscribe
usuarios a un canal en particular. Cuando se agrega una nueva pregunta, le enviaría publish
un mensaje a ese canal. Todos los usuarios recibirían el mensaje. Tendrá que usar una tecnología web como tomas web o cometas para entregar el mensaje al navegador, pero Redis lo ayuda con toda la tubería en el 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