sql >> Base de Datos >  >> NoSQL >> Redis

¿Redis es solo un caché?

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

Al igual que 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 forma de entender Redis es modelar una aplicación sin pensar en cómo la vas a almacenar en una base de datos.

Digamos que queremos construir StackOverflow.com. Para mantenerlo simple, necesitamos Preguntas, Respuestas, Etiquetas y Usuarios.

Modelado de preguntas, usuarios y respuestas

Cada objeto se puede modelar como un mapa. Por ejemplo, una Pregunta es un mapa con campos {id, título, fecha_preguntada, votos, preguntado_por, estado}. De manera similar, una respuesta es un mapa con campos {id, question_id, answer_text, answer_by, votes, status}. De manera similar, 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

Gestión de votos

Ahora, cada vez que alguien vote a favor de 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 mostrarlas en la página de inicio. Si estuviera escribiendo un programa .NET o Java, almacenaría las preguntas en una Lista. Resulta que esa también es la mejor manera de almacenar esto 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 desee mostrar su página de inicio, le pedirá 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 las identificaciones, recupere elementos de Redis mediante la canalización y muéstreselos 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, las preguntas nuevas o las preguntas sin responder debajo de cada etiqueta.

Para modelar esto, usamos la función 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.

Sigamos adelante y hagamos 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í? Agregamos preguntas a un conjunto ordenado y asociamos una puntuación (número de votos) a cada pregunta. Cada vez que se vote a favor de una pregunta, incrementaremos su puntuación. Y cuando un usuario hace clic en "Preguntas etiquetadas Redis, ordenadas por votos", simplemente hacemos un zrevrange y recupera las preguntas principales.

Preguntas en tiempo real sin actualizar la página

Y finalmente, una función adicional. Si mantiene abierta la página de preguntas, SO le notificará cuando se agregue una nueva pregunta. ¿Cómo puede Redis ayudar aquí?

Redis tiene un modelo pub-sub. Puede crear canales, por ejemplo, "channel_questions_tagged_redis". Entonces subscribe usuarios a un canal en particular. Cuando se agrega una nueva pregunta, publish un mensaje a ese canal. Todos los usuarios recibirían el mensaje. Tendrá que usar una tecnología web como web sockets o comet para entregar el mensaje al navegador, pero Redis lo ayuda con toda la plomería en el lado del servidor.

Persistencia, Confiabilidad, etc.

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