Utilizando um hash podemos definir vários conjuntos de campo-valor
para uma única chave. Veja a seguir 3.2 uma ilustração do tipo de dado Hash: Figura 3.2: Tipo de dado Hash
Para demonstrar o uso de hashes iremos dar continuidade ao exemplo da
seção anterior. O JSON que recebemos possui três valores distintos, que são a data do sorteio, os números do sorteio e a quantidade de ganhadores. Todos
esses dados são correspondentes a uma única informação, que é o resultado
de um sorteio da Mega-Sena.
Antes tínhamos um único valor para uma chave, mas agora temos dois
valores distintos referentes a uma chave. Quando utilizamos os comandos
SET e GET estávamos utilizando dados na forma de strings; agora vamos utilizar uma outra forma de dados suportada pelo Redis: os hashes.
Dando continuidade ao nosso exemplo, vamos refazer nosso código para
24
Casa do Código
Capítulo 3. Redis no mundo real Parte 1
armazenar no Redis uma chave utilizando o mesmo formato da seção 3.2 e,
como valor, os campos do número de ganhadores e dos números sorteados,
da seguinte forma:
String ganhadores = "22";
String dataSorteio = "09-11-2013";
String numeros = "8, 18, 26, 42, 56, 58";
String chave = String.format("resultado:%s:megasena",
dataSorteio);
Jedis jedis = new Jedis("localhost");
long resultado1 = jedis.hset(chave, "ganhadores", ganhadores);
long resultado2 = jedis.hset(chave, "numeros", numeros);
String mensagem = String.format(
"Resultado 1 = %d, Resultado 2 = %d",
resultado1,
resultado2
);
System.out.println(mensagem);
O resultado do código anterior é:
Resultado 1 = 1, Resultado 2 = 1
No exemplo anterior,
nós definimos os campos
ganhadores
e
numeros
e
seus
respectivos
valores
para
a
chave
resultado:09-11-2013:megasena.
Diferente do comando
SET, o
HSET retorna o número 1 caso tenha armazenado o campo de forma correta,
ou 0 caso o campo já exista ou seu valor tenha sido alterado.
Para obter os campos armazenados em um chave do tipo hash, utilizamos
o comando HGET e informamos a chave e o campo cujo valor queremos obter.
Veja um exemplo de como utilizá-lo:
String chave = "resultado:09-11-2013:megasena";
Jedis jedis = new Jedis("localhost");
String ganhadores = jedis.hget(chave, "ganhadores");
25
3.3. Utilizando hashes
Casa do Código
String numeros = jedis.hget(chave, "numeros");
String mensagem = String.format(
"Ganhadores = %s, Numeros = [%s]",
ganhadores,
numeros
);
System.out.println(mensagem);
Vejamos a seguir o resultado desse código:
Ganhadores = 22, Numeros = [8, 18, 26, 42, 56, 58]
Exercícios sobre hashes
1) Podemos utilizar o comando HDEL para remover um campo associado a
um determinado hash, utilize-o para apagar o campo ganhadores do
hash resultado:megasena;
2) O comando
HEXISTS verifica se um campo existe em um hash;
utilize-o para verificar se o campo
ganhadores existe no hash
resultado:megasena;
3) O comando HLEN informa a quantidade de campos que estão associados
a um hash; utilize-o para saber quantos campos estão associados ao hash
resultado:megasena;
Referência rápida de comandos para hashes
HDEL chave campo [campo ...] remove o(s) campo(s) e
seu(s) respectivo(s) valor(es) do hash informado;
HEXISTS chave campo determina se um hash e seu campo exis-
tem;
HGET chave campo retorna o valor do campo associado ao hash
informado;
26
Casa do Código
Capítulo 3. Redis no mundo real Parte 1
HLEN hash retorna a quantidade de campos que um hash possui;
HMGET chave campo [campo ...] retorna os valores de todos
os campos informados que são associados a um hash;
HMSET chave campo valor [campo valor ...]
define
múltiplos campos e valores em um hash;
HSET chave campo valor armazena um hash com o campo e
seu respectivo valor. Caso o hash e o campo já existam, o valor é so-
brescrito.
3.4
Próximos passos
A primeira parte dos exemplos de uso do Redis abordaram o conceito de ca-
che com Strings. Vimos também como realizar consultas de chaves com um
determinado padrão de nomenclatura. Na sequência, vimos como utilizar
Hashes para conseguirmos estruturas de dados mais complexas.
No próximo capítulo, vamos ver a segunda parte dos exemplos práticos e
conhecer mais um pouco o que podemos fazer com o Redis de forma simples,
rápida e fácil. Vamos aprender a definir um tempo de expiração para as chaves do Redis e também a efetuar incremento e decremento em números.
27
Capítulo 4
Redis no mundo real Parte 2
4.1
Expirando chaves de forma automática
Você tem uma aplicação web que armazena informações nas sessões dos usuá-
rios. Inicialmente, esta aplicação estava sendo executada em apenas um ser-
vidor, mas devido à alta demanda de acesso, você precisa adicionar mais um
servidor para sua aplicação. Embora você tenha solucionado o problema de
demanda de acesso, agora você tem um problema com as sessões dos usuários
que não estão acessíveis em ambos os servidores.
Existem diversas soluções para este problema de sessões, como replicar
as sessões entre todos os servidores, ou utilizar sticky sessions para que o balanceador de carga sempre se conecte com mesmo servidor que possui a