que fosse encerrado, as próximas tentativas de obter um valor da lista pelo comando BLPOP aguardaram durante 2 segundos e, em seguida, apresentaram
uma mensagem informando que a lista não cotinha nenhum item novo.
O nosso exemplo termina aqui. Resumidamente, tudo o que precisamos
para ter uma fila de mensagens ou tarefas funcionando no Redis foram dois
comandos. O primeiro foi o RPUSH, para enviar novos itens para o final da
lista (fila), e o segundo foi o BLPOP, que remove e retorna os itens da lista por ordem de chegada.
Exercícios sobre filas
1) O comando BRPOP funciona da mesma forma que o BLPOP; a única di-
ferença entre eles é que o BRPOP remove e retorna o último item (tail)
da lista. Utilize-o no exemplo de envio de e-mail e veja como a lista se
comporta com ele;
2) Altere o comando RPUSH pelo LPUSH no exemplo que popula a lista
fila:confirmar-usuario e veja como a lista se comporta com ele.
Referência rápida de comandos para filas (listas)
RPUSH chave valor [valor ...] adiciona um ou mais valo-
res ao final (tail) da lista definida pela chave;
RPUSHX chave valor funciona da mesma forma que o comando
RPUSH; a única diferença entre os dois é que o comando RPUSHX insere
um novo item somente em uma lista já existente. Caso a lista informada
como parâmetro não exista, o comando retorna o valor 0 e a lista não
é criada;
LPUSHX chave valor funciona da mesma forma que o comando
LPUSH; a única diferença entre os dois é que o LPUSHX insere um novo
item somente em uma lista já existente. Caso a lista informada como
parâmetro não exista, o comando retorna o valor 0 e a lista não é criada;
62
Casa
do Código
Capítulo 5. Redis no mundo real Parte 3
LPOP chave remove e retorna o primeiro (head) item da lista in-
formadas como parâmetro ou (nil) caso a lista esteja vazia;
BLPOP chave [chave] timeout bloqueia a conexão para re-
mover e retornar o primeiro item de uma das listas informadas como
parâmetro durante um tempo máximo definido no parâmetro timeout.
Caso o timeout seja definido como 0, a conexão fica bloqueada até que
um item de uma das listas informadas seja removido e retornado pelo
comando;
RPOP chave remove e retorna o ultimo (tail) item da lista informa-
das como parâmetro ou (nil) caso a lista esteja vazia;
BRPOP chave [chave] timeout bloqueia a conexão para re-
mover e retornar o último item de uma das listas informadas como
parâmetro durante um tempo máximo definido no parâmetro timeout.
Caso o timeout seja definido como 0, a conexão fica bloqueada até que
um item de uma das listas informadas seja removido e retornado pelo
comando.
5.3
Manipular relacionamento entre amigos e
seus grupos
Chegou o momento de conhecer um nova estrutura de dados suportada pelo
Redis. Esta estrutura é chamada de conjunto ou set. Ela é muito similar ao tipo lista, que conhecemos neste mesmo capítulo, sendo que sua principal
diferença é que um set não permite valores iguais. Isso é essencial quando
precisamos garantir que não teremos valores repetidos e, assim, não precisamos nos preocupar em verificar antes de inserir novo valor se este já existe no Redis.
Um SET é uma coleção não-ordenada de binary-safe strings, e além de
armazenar itens, existem outras operações que podem ser realizadas entre
conjuntos, como a interseção entre dois ou mais conjuntos, a diferença entre dois ou mais conjuntos e a união entre dois ou mais conjuntos.
Neste exemplo, vamos criar um código para manipular a conexão entre
amigos e seus grupos. Nada muito complexo, apenas operações como uma
63
5.3. Manipular relacionamento entre amigos e seus grupos
Casa do Código
pessoa adicionando outra como seu amigo e uma pessoa entrando para um
grupo de pessoas, operações comuns em redes sociais, por exemplo. A ideia
principal desse caso é conseguir extrair informações de forma fácil dos dados armazenados. Veja algumas informações que conseguiremos obter:
Saber quantas pessoas pertencem a cada grupo;
Listar as pessoas que são membros de um determinado grupo;
Saber se uma pessoa é membro de um determinado grupo;
Obter todos os relacionamentos de uma pessoa que também pertence
a determinado grupo.
Para isso, vamos precisar de dois conjuntos para representar nossos da-
dos: um para representar as pessoas e outro para representar os grupos. Veja a composição de cada chave que vai representar os dois conjuntos:
pessoas:{codigo-da-pessoa}:relacionamentos
grupos:{codigo-do-grupo}:membros
Vamos utilizar apenas um nome simples para representar cada pessoa e
cada grupo. Em um exemplo mais real, esses códigos poderiam ser um código
de uma chave de um hash que teria todos os dados referentes a uma pessoa
ou um grupo. Vamos começar com um exemplo para popular os relaciona-
mentos entre as pessoas, depois um outro para popular os membros de cada
grupo e, por último, outro para obter as informações que precisamos. Veja o primeiro exemplo a seguir:
public class ConjuntoDeRelacionamentoEntrePessoas {
public void adicionaAmigos(String pessoa, String[] amigos) {