(integer) 1
127.0.0.1:6379> GETBIT acessos_dias_01_ou_02 20
(integer) 1
127.0.0.1:6379> GETBIT acessos_dias_01_ou_02 30
45
4.3. Estatísticas de usuários únicos por data
Casa do Código
(integer) 1
127.0.0.1:6379> GETBIT acessos_dias_01_ou_02 40
(integer) 1
No bloco anterior, o comando BITCOUNT retornou a quantidade de
valores armazenados na chave com o resultado da operação que usou o
operador
OR, que no nosso exemplo são 4.
Em seguida, executamos
o comando
GETBIT para cada valor existente em ambas as chaves (
acesso:01/01/2014 e acesso:02/01/2014) para confirmar que todos
os valores estão com o bit definido como 1.
O comando BITOP e seus operadores
O comando BITOP suporta quatro operadores lógicos:
AND, OR,
XOR e NOT. Os operadores AND, OR e XOR são executados todos da
mesma forma: em outras palavras, você informa uma chave que irá re-
ceber o resultado da operações seguida pelas chaves que serão utilizadas
na operação.
Já o operador NOT é executado utilizando apenas uma chave para re-
ceber os valores do resultado e uma chave com os valores que serão utili-
zados na operação. De forma resumida, o operador NOT apenas inverte
os bits dos valores (offsets).
Exercícios sobre Bitmaps
1) Utilize o comando
BITOP com o operador
XOR entre as chaves
acesso:01/01/2014 e acesso:02/01/2014 e armazene o resultado
em uma chave chamada acessos_dias_01_xor_02;
2) Utilize o comando
BITOP
com o operador
NOT
na chave
acesso:03/01/2014 e armazene o seu resultado em uma chave
chamada acessos_dia_04_not.
46
Casa do Código
Capítulo 4. Redis no mundo
real Parte 2
Referência rápida de comandos para Bitmaps
BITCOUNT chave retorna a quantidade de bits definidos em uma
chave;
BITOP operador chave-resultado chave [chave...]
realiza uma operação lógica entre diversas chaves e armazena seu
resultado em uma chave definida;
GETBIT chave offset retorna o valor do bit de um offset arma-
zenado em uma chave;
SETBIT chave offset valor define o valor do bit de um offset
de uma chave.
4.4
Próximos passos
Nesta segunda parte, nós aprendemos a como incrementar e decrementar va-
lores numéricos armazenados no Redis e também como aplicar um tempo de
expiração para as chaves armazenadas. Além disso, também conhecemos um
poderoso recurso chamado Redis Bitmaps e aprendemos a utilizá-lo em um
cenário real.
No próximo capítulo, vamos continuar com a terceira parte dos exem-
plos práticos, com mais comandos novos e com dois novos tipos de dados
suportados pelo Redis, o List e o Set.
47
Capítulo 5
Redis no mundo real Parte 3
5.1
Lista das últimas páginas visitadas
Dados do tipo list (ou lista) no Redis são basicamente listas de strings ordenadas pela ordem de inserção de cada item. O Redis possibilita que um novo
item da lista possa ser inserido tanto no início (head) da lista como no seu final (tail), utilizando os comandos LPUSH e RPUSH respectivamente. O tamanho máximo de elementos contidos em uma única lista é de mais de quatro
bilhões de elementos ou, sendo mais preciso, 4294967295 elementos. Veja a
seguir 5.1 uma ilustração do tipo de dado List:
5.1. Lista das últimas páginas visitadas
Casa do Código
Figura 5.1: Tipo de dado List
Agora que tivemos uma rápida introdução sobre o tipo de dado list, va-
mos criar um exemplo de uso utilizando um recurso muito útil e simples de
implementar com o Redis: exibir os últimos elementos adicionados a uma
lista. Mas para tornar o exemplo mais real vamos exibir as últimas páginas
visitadas do blog fictício chamado Tudo Sobre Redis, que conhecemos na se-
ção 4.2. Esse conceito pode, inclusive, ser aplicado ou adaptado em outros
contextos, como para exibir os últimos itens visitados em uma loja virtual ou as últimas mensagens de um perfil em uma rede social.
Como exemplos para as últimas páginas visitadas do nosso blog, vamos
rever as páginas que usamos no exemplo anterior da seção 4.2:
/inicio
/contato
/sobre-mim
/todos-os-posts
/armazenando-dados-no-redis
Note que as páginas serão inseridas em uma lista no Redis seguindo esta
mesma ordem, que refere-se à ordem na qual elas foram acessadas, sendo
que o primeiro elemento /inicio corresponde à primeira página acessada e
50
Casa do Código
Capítulo 5. Redis no mundo real Parte 3
assim sucessivamente. Para armazená-las, vamos utilizar o comando LPUSH,
que insere um novo item ao topo (head) da lista e aceita um ou mais elementos para que sejam armazenados em uma lista. Vejamos o exemplo em Java do
seu uso:
String chave = "ultimas_paginas_visitadas";
String[] paginasVisitadas = {
"/inicio",
"/contato",
"/sobre-mim",
"/todos-os-posts",
"/armazenando-dados-no-redis"
};
Jedis jedis = new Jedis("localhost");
Long resultado = jedis.lpush(chave, paginasVisitadas);
System.out.println(
String.format(
"A lista %s contém %d elementos", chave, resultado
)
);
A
lista
utilizada
nesse
exemplo
chama-se
ultimas_paginas_visitadas.
Para o nosso caso, enviamos todas
as páginas para o Redis de uma única vez, mas em aplicações reais, isso seria feito a cada página, conforme elas fossem visitadas.