A mensagem de resultado do exemplo anterior é:
A lista ultimas_paginas_visitadas contém 5 elementos
Para validarmos que a lista que acabamos de criar contém os cinco ele-
mentos, vamos executar o comando LLEN pelo CLI informando a chave que
corresponde à nossa lista e conferir seu tamanho:
redis 127.0.0.1:6379> LLEN ultimas_paginas_visitadas
(integer) 5
Já temos uma lista
populada no Redis com as últimas páginas visitadas,
mas, embora tenhamos armazenado 5 elementos na nossa lista, vamos definir
51
5.1. Lista das últimas páginas visitadas
Casa do Código
que iremos exibir apenas as três últimas páginas recentemente visitadas. Podemos utilizar o comando LRANGE, e para isso basta informar o índice inicial e o índice final dos elementos que queremos recuperar e assim obtemos uma
quantidade limitada de elementos de uma lista.
Os índices utilizados no comando LRANGE iniciam pelo número 0, que
representa o último item adicionado à lista ou o topo da lista (head). Tam-
bém é possível utilizar números negativos como índice, como por exemplo o
número -1, que se refere ao primeiro item adicionado à lista ou ao fim da lista (tail); o número -2 refere-se ao segundo item adicionado à lista e assim por diante. Seguindo com o nosso exemplo, vamos utilizar esse comando para
obter as três últimas páginas visitadas:
String chave = "ultimas_paginas_visitadas";
Jedis jedis = new Jedis("localhost");
List<String> paginas = jedis.lrange(chave, 0, 2);
System.out.println("As 3 ultimas paginas visitadas são:");
for (String pagina : paginas) {
System.out.println(pagina);
}
O resultado do código anterior é:
As 3 ultimas paginas visitadas são:
/armazenando-dados-no-redis
/todos-os-posts
/sobre-mim
Com isso, temos a primeira parte do nosso exemplo funcionando e já po-
demos exibir as três últimas páginas visualizadas no nosso blog Tudo Sobre
Redis. Mas se pensarmos um pouco nessa solução, veremos que ela tem um
problema, porque o blog irá armazenar uma grande quantidade de itens (pá-
ginas visitadas) na lista, porém sempre irá exibir apenas três itens.
Com o conhecimento sobre esse problema, vemos que é desnecessário
manter armazenadas todas as páginas acessadas. Dessa forma, começamos a
segunda parte do nosso exemplo, que é limitar a quantidade de itens inseridos na nossa lista.
52
Casa do Código
Capítulo 5. Redis no mundo real Parte 3
Vamos utilizar o comando LTRIM para restringirmos a quantidade de
páginas acessadas. Com ele, podemos definir através de um índice inicial e
outro final um range que será mantido na lista e todos os registros restantes serão removidos dela. Os índices utilizados no comando LTRIM funcionam
da mesma forma que os utilizado no comando LRANGE.
Para mantermos as três ultimas páginas adicionadas à nossa lista, temos
que passar o índice 0 como posição inicial e o índice 2 (índices no Redis iniciam na posição 0) como posição final. Veja a seguir como fazer isso em Java: String chave = "ultimas_paginas_visitadas";
Jedis jedis = new Jedis("localhost");
String resultado = jedis.ltrim(chave, 0, 2);
System.out.println(String.format("Resultado: %s", resultado));
O código anterior imprime o resultado:
Resultado: OK
Para validarmos que nossa lista agora contém apenas três páginas, vamos
executar novamente o comando LLEN:
redis 127.0.0.1:6379> LLEN ultimas_paginas_visitadas
(integer) 3
Pronto, agora sempre que uma página for visitada e a adicionarmos no
Redis, basta em seguida executar o comando LTRIM para remover os regis-
tros desnecessários.
Exercícios sobre listas
1) O comando LINDEX retorna o valor de um item da lista de acordo com
o índice informado. Utilize-o para ver qual é a primeira e a última página
da lista ultimas_paginas_visitadas;
2) O comando LREM remove um ou mais elementos de uma lista associ-
ada a uma chave. Utilize-o para remover todos os elementos da lista
ultimas_paginas_visitadas de uma única vez.
53
5.2. Criando uma fila de mensagens
Casa do Código
Referência rápida de comandos para listas
LPUSH chave valor [valor ...] adiciona um ou mais valo-
res ao topo (head) da lista definida pela chave;
LLEN chave retorna a quantidade de itens armazenados em uma
lista;
LRANGE chave inicio fim retorna um range de itens armaze-
nados em uma lista, os valores inicio e fim são índices iniciados em
0;
LTRIM chave inicio fim apara a lista deixando apenas os itens
definidos entre os índices de inicio e fim.
5.2
Criando uma fila de mensagens
Neste próximo exemplo vamos ver como utilizar os Redis para gerenciar uma
fila de mensagens. Isso é muito útil quando precisamos executar tarefas em
background ou enviar e receber mensagens entre aplicações de forma assín-
crona. O Redis é muito utilizado para armazenar filas de mensagens, tanto
que originou várias ferramentas que utilizam o Redis para esta finalidade.
Algumas das mais populares são:
Resque https://github.com/resque/resque
RestMQ http://restmq.com/
RQ http://python-rq.org/
Sidekiq http://sidekiq.org/