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

Шрифт
Фон

sessão do usuário. Deixando de lado os prós e contras de cada solução, vamos conhecer uma outra solução que é utilizar o Redis para armazenar e controlar a expiração desses dados de sessão sem a necessidade de replicar os dados

4.1. Expirando chaves de forma automática

Casa do Código

entre cada servidor.

Vamos iniciar estipulando que toda sessão deverá existir por no máximo

30 minutos, independente de o usuário estar realizando ações ou não na apli-cação. Para compor a sessão, iremos utilizar o código do usuário, seu nome e seu e-mail. Vamos continuar utilizando o formato hash para armazenar essas informações no Redis, porém, dessa vez, utilizaremos o comando HMSET

para que possamos enviar vários campos e seus respectivos valores de uma

vez ao Redis. Veja o exemplo a seguir:

final String codigoDoUsuario = "1962";

final String nomeDoUsuario = "Peter Parker";

final String emailDoUsuario = "spidey@marvel.com";

String chave = "sessao:usuario:" + codigoDoUsuario;

Map<String, String> campos = new HashMap<String, String>() {{

put("codigo", codigoDoUsuario);

put("nome", nomeDoUsuario);

put("email", emailDoUsuario);

}};

Jedis jedis = new Jedis("localhost");

String resultado = jedis.hmset(chave, campos);

System.out.println(resultado);

Diferente do exemplo em que utilizamos o comando HSET diversas vezes

para armazenar todos os campos que queríamos, com o HMSET foi necessá-

rio usá-lo apenas uma vez, pois esse comando recebe como parâmetro um

conjunto (no caso do Java é um Map) com todos as chaves e valores. Caso os

dados sejam armazenados corretamente, o resultado do comando HMSET é

um OK.

O Redis possui um recurso muito interessante que é a possibilidade de

definir um tempo de expiração para qualquer chave armazenada nele. Pode-

mos verificar esse tempo de expiração utilizando o comando TTL, e para isso vamos utilizá-lo na chave que acabamos de criar usando o CLI:

30

Casa do Código

Capítulo 4. Redis no mundo real Parte 2

redis 127.0.0.1:6379> TTL "sessao:usuario:1962"

(integer) -1

Quando o comando TTL retorna -1, significa que a chave não possui um

tempo de expiração. Caso o comando tivesse retornado o número -2, sig-

nificaria que a chave não existisse no Redis. Um dos comandos que o Re-

dis fornece para definir um tempo de expiração de uma chave é o EXPIRE;

utilizando-o, podemos definir em quantos segundos uma chave irá expirar.

Vamos definir o tempo de expiração da sessão em 30 minutos para a sessão

que criamos no código anterior, da seguinte forma:

String codigoDoUsuario = "1962";

String chave = "sessao:usuario:" + codigoDoUsuario;

int trintaMinutosEmSegundos = 1800;

Jedis jedis = new Jedis("localhost");

long resultado = jedis.expire(chave, trintaMinutosEmSegundos);

System.out.println(resultado);

O comando EXPIRE

retorna 1 quando a definição foi realizada ou 0 caso

a chave não exista ou o tempo especificado não possa ser definido. Agora

podemos novamente utilizar o comando TTL para ver o tempo restante que

falta para a sessão criada expirar.

redis 127.0.0.1:6379> TTL "sessao:usuario:1962"

(integer) 1773

Como vimos nos exemplos anteriores, definir um tempo de expiração

para um chave no Redis é uma tarefa simples e muito útil em diversos ca-

sos em que você precisa manter um dado armazenado apenas durante um

tempo.

Exercícios sobre TTL

1) O comando PERSIST remove um tempo de expiração para um chave.

Utilize-o para remover o tempo de expiração da sessão armazenada no

hash "sessao:usuario:1962";

31

4.2. Estatísticas de páginas visitadas

Casa do Código

2) O comando HMGET serve para que possamos obter o valor de vários cam-

pos associados a um hash de uma vez. Utilize-o para obter os dados da

sessão armazenada no hash "sessao:usuario:1962";

3) O comando PEXPIRE funciona da mesma forma que o EXPIRE, mas

o tempo de expiração que ele recebe é em milissegundos, enquanto o

do

EXPIRE é em segundos. Utilize o PEXPIRE para que a chave

"sessao:usuario:1962" expire em 30 minutos (converta para milis-

segundos);

Referência rápida de comandos para expiração de dados

EXPIRE chave tempo define um tempo (em segundos) de expi-

ração para uma chave;

PERSIST chave remove o tempo de expiração de uma chave;

PEXPIRE chave tempo define um tempo (em milissegundos) de

expiração para uma chave;

PTTL chave retorna o tempo (em milissegundos) de vida restante

para expiração da chave;

TTL chave retorna o tempo (em segundos) de vida restante para

expiração da chave.

4.2

Estatísticas de páginas visitadas

Armazenar estatísticas de acesso para as páginas de um site em tempo real

pode parecer uma tarefa complexa que envolveria diversos sistemas traba-

lhando em conjunto e um volume grande de dados armazenados a cada mi-

nuto ou até mesmo a cada segundo. Com o Redis, podemos facilmente re-

alizar essa tarefa sem nenhum impacto em desempenho e ocupando pouco

espaço para armazenamento de dados.

Para este exemplo, será definido que iremos manter as estatísticas de pá-

ginas visitadas por dia. Assim é possível saber quantas vezes cada página de 32

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

0
Шрифт
Фон

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