Lazoti Rodrigo - Armazenando dados com Redis стр 22.

Шрифт
Фон

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");

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке