Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

O Redis é apenas um cache?


Não, o Redis é muito mais que um cache.

Como um Cache, o Redis armazena pares chave=valor. Mas, diferentemente de um cache, o Redis permite operar nos valores. Existem 5 tipos de dados no Redis - Strings, Sets, Hash, Lists e Sorted Sets. Cada tipo de dados expõe várias operações.

A melhor maneira de entender o Redis é modelar um aplicativo sem pensar em como você vai armazená-lo em um banco de dados.

Digamos que queremos construir StackOverflow.com. Para simplificar, precisamos de Perguntas, Respostas, Tags e Usuários.

Perguntas de modelagem, usuários e respostas


Cada objeto pode ser modelado como um Map. Por exemplo, uma pergunta é um mapa com campos {id, title, date_asked, votes, ask_by, status}. Da mesma forma, uma resposta é um mapa com campos {id, question_id, answer_text, answer_by, votes, status}. Da mesma forma, podemos modelar um objeto de usuário.

Cada um desses objetos pode ser armazenado diretamente no Redis como um Hash. Para gerar IDs exclusivos, você pode usar o comando de incremento atômico. Algo assim -
$ 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

Gerenciando votos


Agora, toda vez que alguém votar em uma pergunta ou resposta, você só precisa fazer isso
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Lista de perguntas para a página inicial


Em seguida, queremos armazenar as perguntas mais recentes para exibir na página inicial. Se você estivesse escrevendo um programa .NET ou Java, armazenaria as perguntas em uma Lista. Acontece que essa é a melhor maneira de armazenar isso no Redis também.

Toda vez que alguém faz uma pergunta, adicionamos seu id à lista.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Agora, quando você quiser renderizar sua página inicial, pergunte ao Redis as 25 perguntas mais recentes.
$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Agora que você tem os ids, recupere itens do Redis usando pipelining e mostre-os ao usuário.

Perguntas por Tags, Classificadas por Votos


Em seguida, queremos recuperar perguntas para cada tag. Mas o SO permite que você veja as perguntas mais votadas, novas perguntas ou perguntas não respondidas em cada tag.

Para modelar isso, usamos o recurso Sorted Set do Redis. Um Conjunto Ordenado permite associar uma partitura a cada elemento. Você pode então recuperar elementos com base em suas pontuações.

Vamos em frente e fazer isso para a tag 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"

O que fizemos aqui? Adicionamos perguntas a um conjunto ordenado e associamos uma pontuação (número de votos) a cada pergunta. Cada vez que uma pergunta for votada, aumentaremos sua pontuação. E quando um usuário clica em "Perguntas marcadas Redis, classificadas por votos", fazemos apenas um zrevrange e voltar as principais perguntas.

Perguntas em tempo real sem atualizar a página


E, finalmente, um recurso de bônus. Se você mantiver a página de perguntas aberta, o SO irá notificá-lo quando uma nova pergunta for adicionada. Como o Redis pode ajudar aqui?

Redis tem um modelo pub-sub. Você pode criar canais, por exemplo "channel_questions_tagged_redis". Você então subscribe usuários a um determinado canal. Quando uma nova pergunta é adicionada, você publish uma mensagem para esse canal. Todos os usuários então receberiam a mensagem. Você terá que usar uma tecnologia da web como web sockets ou cometa para realmente entregar a mensagem ao navegador, mas o Redis o ajuda com todo o encanamento no lado do servidor.

Persistência, confiabilidade etc.


Ao contrário de um Cache, o Redis mantém os dados no disco rígido. Você pode ter uma configuração mestre-escravo para fornecer melhor confiabilidade. Para saber mais, consulte os tópicos Persistência e Replicação aqui - http://redis.io/documentation