Arrays.asList(diario),
totalDiario
)
);
System.out.println(
String.format(
"Total de usuários únicos nos dias %s foi: %d",
Arrays.asList(semanal),
totalSemanal
)
);
}
42
Casa do Código
Capítulo 4. Redis no mundo real Parte 2
}
Nesse exemplo, utilizamos um novo comando, o BITCOUNT. Ele retorna
o número de bits definidos no valor de uma chave, ou seja, ele soma a quantidade de offsets que tiveram o bit definido como 1 em um bitmap. O resultado desse exemplo é:
Total de usuários únicos no dia [05/11/2013]: 32
Total de usuários únicos nos dias [16/11/2013,
17/11/2013, 18/11/2013,
19/11/2013, 20/11/2013,
21/11/2013, 22/11/2013]: 193
Agora para facilitar nosso próximo exemplo e garantir que o resultado
apresentado seja o mesmo sempre, vamos definir o acesso de alguns usuários
representados pelos códigos 10, 20, 30 e 40 para os dias 1, 2, 3 de janeiro de 2014. Veja os comandos a seguir executados no CLI:
127.0.0.1:6379> SETBIT acesso:01/01/2014 10 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:01/01/2014 20 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:01/01/2014 30 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:02/01/2014 20 1
(integer) 1
127.0.0.1:6379> SETBIT acesso:02/01/2014 30 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:02/01/2014 40 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:03/01/2014 10 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:03/01/2014 20 1
(integer) 0
127.0.0.1:6379> SETBIT acesso:03/01/2014 30 1
(integer) 0
43
4.3. Estatísticas de usuários únicos por data
Casa do Código
Já temos os dados definidos, agora vamos supor que precisamos saber
quantos usuários únicos realizaram acesso tanto no dia 01 como no dia 02.
Inicialmente, você pode pensar que isso é simples de se resolver, pois pode-ríamos obter todos os usuários do dia 01 e depois todos os usuários do dia 02, e fazer uma comparação.
Simples assim, não? Não, porque você esqueceu que os dados estão ar-
mazenados em forma de bitmap. Mas para nossa sorte, o Redis fornece uma forma bem simples e versátil de fazer esse tipo de consulta. Para isso vamos utilizar e conhecer o comando BITOP, que realiza operações binárias (Bitwise Operation) [9] entre múltiplas chaves e o resultado dessa operação é armazenada em uma nova chave.
Para facilitar o seu entendimento, vamos colocar o seu uso em prática
para resolver o nosso exemplo. Veja a seguir o comando:
127.0.0.1:6379> BITOP AND acessos_dias_01_e_02 acesso:01/01/2014
acesso:02/01/2014
(integer) 6
Embora à primeira vista o uso do comando BITOP pareça complexo, ele
é bem simples. Repare que, logo após o comando, é informado o tipo de ope-
ração binária que será realizada, que no nosso exemplo é o
operador AND. A
seguir, informamos o nome de uma nova chave ( acessos_dias_01_e_02)
que ainda não existe; o resultado desse comando será armazenado nessa
chave. E por fim, as chaves acesso:01/01/2014 e acesso:02/01/2014,
que serão utilizadas pelo comando BITOP.
Nesse exemplo, o que o comando faz basicamente é criar uma nova chave
que contenha apenas os valores que tiveram o bit definido como 1 em ambas
as chaves ( 01/01/2014 e(AND) 02/01/2014). Repare também que o co-
mando retornou o valor 6 esse número foi a quantidade de valores que
o comando utilizou na operação e não a quantidade de valores armazenados
na nova chave. Vamos utilizar o comando BITCOUNT para saber quantos
usuários realizaram acessos nos dois dias. Veja o comando a seguir:
127.0.0.1:6379> BITCOUNT acessos_dias_01_e_02
(integer) 2
44
Casa do Código
Capítulo 4. Redis no mundo real Parte 2
Pelo resultado do comando, vemos que dois usuários realizaram acesso
em ambos os dias. Em uma rápida análise no bloco de comandos para popu-
lar nossos dados, conseguimos ver que isso está correto e que o código desses usuários são os códigos 20 e 30, enquanto os códigos 10 e 40 foram descarta-dos. Vamos verificar isso diretamente no Redis, conforme comandos a seguir: 127.0.0.1:6379> GETBIT acessos_dias_01_e_02 10
(integer) 0
127.0.0.1:6379> GETBIT acessos_dias_01_e_02 20
(integer) 1
127.0.0.1:6379> GETBIT acessos_dias_01_e_02 30
(integer) 1
127.0.0.1:6379> GETBIT acessos_dias_01_e_02 40
(integer) 0
Vamos utilizar novamente o mesmo comando e as mesmas chaves, mas
mudaremos o operador AND para OR. Veja os comandos a seguir, executados
diretamente pelo CLI:
127.0.0.1:6379> BITOP OR acessos_dias_01_ou_02 acesso:01/01/2014
acesso:02/01/2014
(integer) 6
Novamente, o comando BITOP retornou o número que 6, que corres-
ponde à quantidade de valores utilizados na operação. As diferenças aqui
ficam por conta do operador OR e da chave que armazenou o resultado, que
agora se chama acessos_dias_01_ou_02. No exemplo do operador AND,
a operação retornou apenas os valores que existiam em ambas as datas ou bitmaps, já usando o operador OR a operação retornou os valores que existem
em uma chave ou em outra. Veja os comandos a seguir:
127.0.0.1:6379> BITCOUNT acessos_dias_01_ou_02
(integer) 4
127.0.0.1:6379> GETBIT acessos_dias_01_ou_02 10