long resultado2 = jedis.hset(chave, "pontuacao", "0");
String mensagem = String.format(
"Resultado 1 = %d, Resultado 2 = %d",
resultado1,
resultado2
);
System.out.println(mensagem);
O resultado desse código é:
Resultado 1 = 1, Resultado 2 = 1
Pelo CLI, podemos conferir o hash armazenado:
redis 127.0.0.1:6379> HGETALL jogador:0001:codigo
1) "nome"
2) "Rafael"
3) "pontuacao"
4) "0"
Repare que usamos um comando novo para o tipo de dados hash, o
HGETALL. Ele retorna todos os campos e seus respectivos valores associados
a um hash.
Conforme vimos, agora já temos um hash criado e um estrutura
definida para representar os dados de um jogador.
O que precisamos agora é utilizar o mesmo conceito de incremento e
decremento que utilizamos na seção 4.2. Os comandos INCR, INCRBY e
INCRBYFLOAT funcionam apenas para valores que são do tipo String. Para
80
Casa do Código
Capítulo 6. Redis no mundo real Parte 4
valores que são do tipo hash, o Redis fornece dois comandos: o HINCRBY e
HINCRBYFLOAT.
Eles funcionam da mesma forma que as suas versões para String, a
única diferença é que, ao invés de informarmos apenas a chave que terá seu
valor incrementado ou decrementado conforme o valor informado, agora va-
mos informar o hash e o campo que terá o valor alterado conforme o valor
definido como incremento.
Vamos criar um novo código em Java para que agora tenhamos uma
forma de armazenar as vitórias e as derrotas dos jogadores. Veja a seguir:
public class ArmazenarPontuacaoJogador {
private void definirNovaPontuacao(int codigoJogador,
int ponto) {
String chave = String.format("jogador:%04d:codigo",
codigoJogador);
Jedis jedis = new Jedis("localhost");
long novaPontuacao = jedis.hincrBy(chave, "pontuacao",
ponto);
System.out.println(
String.format(
"A pontuação do jogador %04d é: %d",
codigoJogador,
novaPontuacao
)
);
}
public void adicionarVitoria(int codigoJogador) {
definirNovaPontuacao(codigoJogador, 1);
}
public void adicionarDerrota(int codigoJogador) {
definirNovaPontuacao(codigoJogador, -1);
}
81
6.1. Armazenando as vitórias dos usuários em um jogo
Casa do Código
public static void main(String[] args) {
int codigoJogador = 1;
ArmazenarPontuacaoJogador pontuacaoJogador =
new ArmazenarPontuacaoJogador();
pontuacaoJogador.adicionarVitoria(codigoJogador);
pontuacaoJogador.adicionarVitoria(codigoJogador);
pontuacaoJogador.adicionarDerrota(codigoJogador);
pontuacaoJogador.adicionarVitoria(codigoJogador);
}
}
E o resultado desse código é:
A pontuação do jogador 0001 é: 1
A pontuação do jogador 0001 é: 2
A pontuação do jogador 0001 é: 1
A pontuação do jogador 0001 é: 2
Exercícios sobre incremento/decremento com hash
1) Atualize o exemplo em Java para que ele utilize o comando
HINCRBYFLOAT de modo que possamos armazenar um double (tipo
primitivo Java para números de ponto flutuante) no campo pontuacao.
Referência rápida de comandos para incremento/decremento com
hash
HINCRBY chave campo incremento incrementa ou decre-
menta o valor (número inteiro) do campo associado a uma chave con-
forme o valor do incremento;
HINCRBYFLOAT chave campo incremento incrementa ou de-
crementa o valor (número de ponto flutuante) do campo associado a
uma chave conforme o valor do incremento.
82
Casa do Código
Capítulo 6. Redis no mundo real Parte 4
6.2
Scores dos jogadores com Sorted Set
O tipo de dado Sorted Set ou conjunto ordenado é muito similar ao tipo de
dado Set, pois em ambos os elementos são únicos. A principal diferença entre eles é que os elementos do Sorted Set contêm uma pontuação (score) para
cada valor ou elemento. Essa pontuação fornece ao Sorted Set a capacidade
de realizar ordenação de valores e também possibilita ranqueá-los de acordo com o score de cada elemento.
Para demonstrar o seu uso, vamos criar uma tabela de pontuação (scores)
de jogadores para um jogo qualquer onde dois jogadores se enfrentam. Toda
vez que um jogador vence, ele recebe mais 10 pontos, enquanto o jogador que foi derrotado perde 5 pontos do seu score. Uma outra regra é que todo novo
jogador recebe 50 pontos ao ingressar no jogo e é por esta regra que vamos
iniciar o nosso desenvolvimento. Veja o seguinte código Java:
public class GerarNovoJogador {
public void adicionarNovoJogador(String jogador) {
String chave = "scores";
double pontuacaoInicial = 50;
Jedis jedis = new Jedis("localhost");
long
resultado = jedis.zadd(chave, pontuacaoInicial,
jogador);
System.out.println(
String.format(
"Novo Jogador: %s com %.0f pontos iniciais. Resultado: %d",
jogador,
pontuacaoInicial,
resultado
)
);
}
public static void main(String[] args) {
GerarNovoJogador novoJogo = new GerarNovoJogador();
novoJogo.adicionarNovoJogador("Aragorn");
83
6.2. Scores dos jogadores com Sorted Set
Casa do Código
novoJogo.adicionarNovoJogador("Gandalf");
novoJogo.adicionarNovoJogador("Legolas");
novoJogo.adicionarNovoJogador("Gandalf");
novoJogo.adicionarNovoJogador("Frodo");
novoJogo.adicionarNovoJogador("Bilbo");