(integer) 5
redis 127.0.0.1:6379> INCRBY pagina:/contato:02/09/2013 -2
(integer) 3
Foi usado inicialmente o comando GET apenas para verificar o valor da
chave pagina:/contato:02/09/2013. Em seguida, usamos o comando
INCRBY para incrementar em 4 e depois decrementar em 2 o valor da chave.
Repare que até agora todas as operações que realizamos foram feitas uti-
lizando números inteiros, mas e se quisermos incrementar ou decrementar
o valor em 0.5? Isso também foi pensado e disponibilizado através do co-
mando INCRBYFLOAT. O comando INCRBYFLOAT interpreta o valor (que
é um String) da chave como um número de ponto flutuante. Vejamos seu
exemplo de uso:
redis 127.0.0.1:6379> GET pagina:/contato:02/09/2013
"3"
redis 127.0.0.1:6379>
INCRBYFLOAT pagina:/contato:02/09/2013 2.789
"5.789"
redis 127.0.0.1:6379>
INCRBYFLOAT pagina:/contato:02/09/2013 -2.789
"3"
Se esquecermos por um minuto que utilizamos um número em
ponto flutuante para incrementar e depois decrementar o valor da chave
pagina:/contato:02/09/2013, não temos nada de muito diferente
quando comparamos esse exemplo de uso do comando INCRBYFLOAT com
o exemplo do comando INCRBY.
36
Casa do Código
Capítulo 4. Redis no mundo real Parte 2
Referência rápida de comandos para Incremento/Decremento
INCR chave incrementa (adiciona 1) ao valor (número inteiro) da
chave;
INCRBY chave incremento incrementa ou decrementa o valor
(número inteiro) da chave conforme o valor do incremento;
INCRBYFLOAT chave incremento incrementa ou decrementa o
valor (número de ponto flutuante) da chave conforme o valor do incre-
mento.
4.3
Estatísticas de usuários únicos por data
Você vê mais um exemplo de estatísticas e logo pensa no comando INCR
ou INCRBY, certo? Errado! Neste exemplo, vamos ver um recurso muito
interessante no Redis, que é chamado de Redis Bitmap. Bitmaps são, em sua essência, um array de bits [2], ou simplificando, um array composto por zeros e uns que podem ser usados como uma representação de determinados tipos
de informação. O Redis fornece diversos comandos para manipular Bitmaps,
entre eles comandos para definir e obter os bits de uma posição (índice) do array definido em uma chave.
Esse exemplo difere do exemplo apresentado na seção 4.2, pois agora ire-
mos armazenar os dados levando em consideração o usuário e a data em que o
usuário acessou o site, enquanto o outro exemplo apenas considerava as visitas realizadas em cada página. A principal diferença é que agora nosso volume de dados armazenados no Redis será infinitamente maior quando comparado
com o outro exemplo, isso porque agora os dados não possuem limites e vão
aumentar de acordo com a quantidade de dias, enquanto o outro tinha dados
baseados apenas na quantidade de páginas do site.
Um outro ponto interessante que devemos entender é que no exemplo
anterior 4.2, o valor armazenado em cada chave já representava o total de
visitas de cada página e não foi necessário efetuar nenhuma outra operação.
Já nesse exemplo os dados são armazenados por cada dia e serão processados
conforme nossa necessidade.
37
4.3. Estatísticas de usuários únicos por data
Casa do Código
E é exatamente por conta desse grande volume de dados (chaves) que te-
remos que armazenar no Redis e das operações que teremos que realizar sobre esses dados que iremos usar Bitmaps, pois ao armazenar os dados de forma
binária, a quantidade de memória ou espaço em memória utilizada para re-
presentar os dados é bem menor. Uma outra característica muito importante
é que cálculos efetuados com comandos de BITMAP são extremamente rápi-
dos e por este motivo é que Bitmaps são utilizados para gerar estatísticas em tempo real sem necessitar de muito recurso de hardware.
Mas ao invés de partirmos diretamente para o exemplo proposto, vamos
executar alguns comandos através do CLI para que o uso de BITMAPS fique
mais claro. Veja a seguir:
127.0.0.1:6379> SETBIT cliques:anuncio:CASADOCODIGO 1000 1
(integer) 0
127.0.0.1:6379> SETBIT cliques:anuncio:CASADOCODIGO 1001 1
(integer) 0
127.0.0.1:6379> SETBIT cliques:anuncio:CASADOCODIGO 1002 1
(integer) 0
A primeira coisa que temos que conhecer é o comando SETBIT. Ele
pode definir ou remover o bit de um offset em um valor armazenado em
uma chave. Um pouco confuso, não? Vamos entendê-lo através do exem-
plo. A princípio, esse comando é parecido com o SET, ou seja, ele de-
fine um valor para uma determinada chave. A chave no nosso exemplo é
cliques:anuncio:CASADOCODIGO e ela representa todos os usuários úni-
cos que, de fato, clicaram no anúncio chamado CASADOCODIGO em uma pá-
gina qualquer do nosso site.
38
Casa do Código
Capítulo 4. Redis no mundo real Parte 2
Cuidado com valores de offsets grandes
Ao utilizar Redis Bitmaps, é possível armazenar dados para milhões
de offsets em pouca quantidade de memória, que no geral pode chegar
em alguns megabytes. É necessário tomar cuidado com valores de off-
sets muito grandes pois, para determinados tamanhos, o Redis precisará