Casa do Código
Capítulo 4. Redis no mundo real Parte 2
um site foi visitada a cada dia. Vamos utilizar o exemplo de um blog chamado Tudo Sobre Redis, que irá conter algumas páginas:
/inicio
/contato
/sobre-mim
/todos-os-posts
/armazenando-dados-no-redis
O primeiro ponto que precisamos definir é a estrutura da chave que será
utilizada para armazenar os dados das estatísticas. Como nossos dados serão separados por dia, temos que utilizar a data na chave e também a página que recebeu a visita. Com essas informações podemos compor uma chave com a
seguinte estrutura:
pagina:[url da pagina]:[data]
Agora vejamos um exemplo de uma chave utilizando valores reais:
pagina:/inicio:12-11-2013
Com a estrutura da chave definida, fica fácil entender como funcionará
o armazenamento das estatísticas. Para isso, basta sempre incrementarmos o
valor da chave a cada respectivo acesso, algo bem comum de realizar. Pode-
ríamos fazer isso armazenando uma nova chave no Redis como o valor 1 no
primeiro acesso de cada página, e posteriormente a cada acesso obter ( GET) o valor da chave, somar 1 ao seu valor e armazená-lo novamente ( SET).
Embora pareça um processo simples de se realizar, seria necessário exe-
cutar dois comandos ( GET e SET) no Redis para cada acesso de página. Um
outro problema em realizar dessa forma é que isso não seria uma operação
atômica, e por isso estaria sujeita a problemas de condição de corrida (race conditions) [7].
Eis que surge o comando INCR. Utilizando-o, podemos incrementar o
valor de uma chave diretamente sem a necessidade de conhecer o seu valor
anterior e assim tornar a operação atômica. Este comando é classificado com um comando para o tipo de dado String, porque no Redis não existe o tipo
de dados Integer. Quando usamos esse comando, o Redis interpreta
o valor
33
4.2. Estatísticas de páginas visitadas
Casa do Código
da chave como um número inteiro de 64 bits com sinal, que significa que a
chave também suporta valores negativos.
Agora que conhecemos esse novo comando, vamos escrever uma aplica-
ção para realizar a tarefa determinada pelo nosso exemplo:
public class GerarEstatisticaDePaginasVisitadas {
public void gerarEstatistica(String pagina, String data) {
String chave = String.format("pagina:%s:%s", pagina, data);
Jedis jedis = new Jedis("localhost");
long resultado = jedis.incr(chave);
System.out.println(
String.format(
"página %s teve %d acesso(s) em %s",
pagina,
resultado,
data
)
);
}
public static void main(String[] args) {
String data = "02/09/2013";
String[] paginasVisitadas = {
"/inicio",
"/contato",
"/sobre-mim",
"/todos-os-posts",
"/armazenando-dados-no-redis"
};
GerarEstatisticaDePaginasVisitadas gerador =
new GerarEstatisticaDePaginasVisitadas();
gerador.gerarEstatistica(paginasVisitadas[0], data);
gerador.gerarEstatistica(paginasVisitadas[1], data);
gerador.gerarEstatistica(paginasVisitadas[2], data);
gerador.gerarEstatistica(paginasVisitadas[1], data);
gerador.gerarEstatistica(paginasVisitadas[1], data);
34
Casa do Código
Capítulo 4. Redis no mundo real Parte 2
}
}
O resultado do código é o seguinte:
página /inicio teve 1 acesso(s) em 02/09/2013
página /contato teve 1 acesso(s) em 02/09/2013
página /sobre-mim teve 1 acesso(s) em 02/09/2013
página /contato teve 2 acesso(s) em 02/09/2013
página /contato teve 3 acesso(s) em 02/09/2013
Simples, não? Vamos conhecer mais alguns comandos que podemos uti-
lizar para incrementar o valor de uma chave e também decrementar seu valor.
Embora eles não tenham uma aplicação prática para o contexto do exemplo
utilizado aqui, é importante conhecê-los e entender seu uso.
Imagine que precisamos decrementar o valor de uma das chaves que cria-
mos anteriormente. Isso pode ser feito de duas formas, sendo que a primeira é com o comando DECR, que decrementa o valor da chave em um número.
Vejamos um exemplo de uso desse pelo CLI:
redis 127.0.0.1:6379> GET pagina:/contato:02/09/2013
"3"
redis 127.0.0.1:6379> DECR get pagina:/contato:02/09/2013
(integer) 2
redis 127.0.0.1:6379> DECR get pagina:/contato:02/09/2013
(integer) 1
No
primeiro
comando,
resgatamos
o
valor
da
chave
pagina:/contato:02/09/2013
que já tínhamos criado anterior-
mente. Na sequência, executamos o comando DECR nessa mesma chave e
seu valor foi decrementado para 2, e na segunda execução, o valor da chave
foi novamente decrementado para 1.
Uma outra forma de decrementar ou incrementar o valor de uma chave
é utilizando o comando
INCRBY. Esse comando se distingue dos ou-
tros, pois nele precisamos determinar o valor do incremento ou decre-
mento que será aplicado à chave. Vamos continuar usando a mesma chave
35
4.2. Estatísticas de páginas visitadas
Casa do Código
pagina:/contato:02/09/2013 e demonstrar o uso desse comando pelo
CLI conforme a sequencia de comandos a seguir:
redis 127.0.0.1:6379> GET pagina:/contato:02/09/2013
"1"
redis 127.0.0.1:6379> INCRBY pagina:/contato:02/09/2013 4