feira e outro no sábado. Embora as informações fornecidas pelo serviço web
da outra empresa sejam dinâmicas, elas são alteradas apenas duas vezes em
um período de uma semana.
Para melhorar o tempo de resposta do site Resultados de Loterias e não fazer consultas desnecessárias ao serviço web da outra empresa, podemos
fazer uma única requisição desses dados no serviço web externo e depois
armazená-los no Redis como um cache interno até que o próximo sorteio
seja realizado para, assim, o site novamente buscar através do serviço web os novos dados.
Para este exemplo, vamos definir que o serviço externo retorne um JSON
conforme o seguinte exemplo:
{
"data": "21-09-2013",
"numeros": [2, 13, 24, 41, 42, 44],
"ganhadores": 2
}
Manipular JSON em Java
Vou omitir a parte de como fazer a conversão de um JSON para um
objeto Java, mas poderíamos utilizar, por exemplo, a biblioteca GSON
para esse propósito. Você pode obter mais informações sobre essa bibli-
oteca através do link:
https://code.google.com/p/google-gson/
Neste primeiro exemplo, vamos utilizar apenas os números do sorteio ob-
tidos pelo JSON anterior. Vamos ver como poderíamos fazer para armazenar
esses números através de uma aplicação Java:
String chave = "resultado:megasena";
String numerosDoUltimoSorteio = "2, 13, 24, 41, 42, 44";
17
3.2. Encontrando as chaves armazenadas
Casa do Código
Jedis jedis = new Jedis("localhost");
String resultado = jedis.set(chave, numerosDoUltimoSorteio);
System.out.println(resultado);
Até aqui não vimos nada muito diferente do que fizemos no capítulo 1
ou 2. Utilizamos o comando SET para armazenar os números em uma chave chamada resultado_megasena e também podemos utilizar o comando GET
para obter o números armazenados nesta mesma chave.
3.2
Encontrando as chaves armazenadas
Continuando com o exemplo do nosso site Resultados de Loterias, além de exibirmos o último sorteio realizado na página inicial, temos também que
ter uma página com o histórico dos resultados anteriores. Nesta página, será possível filtrar os resultados por mês e ano do sorteio, mas para isso temos
que mudar um pouco a estrutura da chave que utilizamos no exemplo anterior.
Antes, nossa chave era definida como resultado:megasena, mas
agora precisamos armazenar vários resultados e para conseguirmos isso
precisamos melhorar a estrutura da nossa chave. A forma mais prática é
inserir a data do sorteio na chave para que ela fique da seguinte forma:
resultado:dd-mm-yyyy:megasena, onde dd é o dia, mm o mês e yyyy
o ano do sorteio. Assim conseguimos ter uma chave para cada sorteio.
18
Casa do Código
Capítulo 3. Redis no mundo real Parte 1
Convenção para nomear chaves no Redis
Utilizar : para compor um namespace na chave é uma conven-
ção muito utilizada no Redis, sendo que um formato de chave muito
comum assemelha-se com tipo-de-objeto:identificador:nome-campo.
Por exemplo, imagine uma chave utilizando esse formato que represente
o nome dos usuários de um sistema. Essa chave poderia ser da seguinte
forma:
usuario:Rodrigo Lazoti:nome
Sendo que usuario é o tipo de objeto, o valor Rodrigo Lazoti
representa o nome do usuário e nome é o nome do campo que dá signi-
ficado ao valor armazenado nesta chave.
Vamos criar um novo exemplo que irá inserir quatro sorteios no Redis
utilizando a nova composição de chave que foi definida. Veja o exemplo a
seguir:
String dataDoSorteio1 = "04-09-2013";
String numerosDoSorteio1 = "10, 11, 18, 42, 55, 56";
String chave1 = String.format("resultado:%s:megasena",
dataDoSorteio1);
String dataDoSorteio2 = "07-09-2013";
String numerosDoSorteio2 = "2, 21, 30, 35, 45, 50";
String chave2 = String.format("resultado:%s:megasena",
dataDoSorteio2);
String dataDoSorteio3 = "21-09-2013";
String numerosDoSorteio3 = "2, 13, 24, 41, 42, 44";
String chave3 = String.format("resultado:%s:megasena",
dataDoSorteio3);
String dataDoSorteio4 = "02-10-2013";
String numerosDoSorteio4 = "7, 15, 20, 23, 30, 41";
String chave4 = String.format("resultado:%s:megasena",
19
3.2. Encontrando as chaves armazenadas
Casa do Código
dataDoSorteio4);
Jedis jedis = new Jedis("localhost");
String resultado = jedis.mset(
chave1, numerosDoSorteio1,
chave2, numerosDoSorteio2,
chave3, numerosDoSorteio3,
chave4, numerosDoSorteio4
);
System.out.println(resultado);
Neste exemplo, foi usado o comando MSET, enquanto no exemplo ante-
rior usamos o comando SET. A única diferença entre o SET e o MSET é que
o MSET aceita vários conjuntos de chave-valor como parâmetro enquanto o
SET aceita apenas um único conjunto de chave-valor.
Se o comando anterior funcionou da forma esperada, o resultado apresen-
tado pelo exemplo será um OK. Agora já temos quatro sorteios para compor nossa página de histórico, mas ainda precisamos criar uma forma de filtrar
esses itens. O Redis possui um comando chamado KEYS, que é usado para
fazer buscar de chaves com base em um determinado padrão (pattern) que é
passado como parâmetro para o comando.