Começando a usar Redis nas suas soluções

Compartilhe

Compartilhar no facebook
Compartilhar no google
Compartilhar no twitter
Compartilhar no linkedin

O que é Redis e para que serve?

Redis é uma solução distribuída de armazenamento de dados muito popular em sistemas desenvolvidos nos últimos tempos. Além de ser fácil de usar, ela suporta vários tipos de estruturas que permitem ao desenvolvedor suprir a grande maioria das necessidades de dados que  um problema pode requerer.

Ele guarda as informações no estilo chave-valor e suporta tipos complexos de valor, o que possibilita o uso da tecnologia em vários tipos de casos. Além disso, o Redis tem estratégias para guardar os dados em memória e em disco, garantindo resposta rápida e persistência de dados.

Os tipos de valores suportados que são usados mais comumente são:

  • String
  • Listas
  • HashMap
  • Set

Repare que a possibilidade de usar HashMap faz com que praticamente qualquer objeto de dados serializável seja capaz de ser guardado no Redis. Os outros tipos de dados suportados são igualmente úteis e podem ser utilizados em casos mais específicos ou mais simples.

Todo valor é acompanhado de uma chave, que é usada para resgatar os valores guardados e torna possível configurar regras de expiração, fazendo com que o Redis funcione como uma espécie de cache para aquele dado.

O Redis não tem o conceito de schemas como outros bancos de dados, por isso é necessário fazer definições de chave que permitam uma separação lógica de cada um dos tipos de dados guardados. Geralmente, se coloca o nome do tipo de dado seguido do seu “id” como, por exemplo, “user:321”, embora isso fique a cargo do desenvolvedor.

Como instalar

Para começar a testar o Redis, basta baixar os arquivos do projeto pelo site oficial e rodar o “make”. Dessa forma, você terá o projeto compilado na sua máquina e poderá subir uma instância do Redis.

A partir daí você será capaz de subir um servidor de Redis local para testes ou utilizar o “cli” para fazer testes dos comandos. Você perceberá que, mesmo que o foque nos comandos da forma que eles são utilizados no “cli“, os clientes implementados para as linguagens mais comuns terão interfaces muito parecidas com as dos comandos básicos.

Para levantar o servidor local utilizando somente uma instância, basta rodar “./redis-server”.

Para levantar o Redis como um cluster, é necessário fazer algumas configurações extras. Caso precise, mais informações podem ser encontradas nesse link. 

Para fim de testes e experimentação, é recomendado rodar “./redis-cli” para ter acesso ao console interativo.

Utilizando os comandos do Redis

Os comandos no Redis são tratados de forma atômica, então, em caso padrão de funcionamento, a ordem de execução das operações é a mesma ordem das chamadas. Isso dá algumas garantias úteis na hora de desenvolver os sistemas que utilizarão o Redis.

Cada um dos tipos de dados diferentes utilizam comandos próprios de escrita e leitura, o que garante o armazenamento da informação fornecida  da forma mais correta para o tipo de dado. Em contrapartida, isso faz com que o desenvolvedor tenha que trabalhar com um conjunto maior de comandos e opções.

Gerenciamento de Chaves

Todos os comandos associados à criação ou alteração de um valor fazem a criação automática da chave associada e, ao passar o parâmetro de expiração,  a deleção da chave ocorre no tempo estabelecido. Então, no caso geral, não é preciso fazer o gerenciamento direto das chave.

No entanto, algumas vezes, é necessário saber se a chave existe ou se é preciso fazer a remoção da chave manualmente. Caso a resposta seja afirmativa, é possível usar os seguintes comandos:

EXISTS chave”: retorna a existência ou não de uma chave.

DEL chave”: faz a deleção da chave determinada.

Como existem comandos para cada tipo de dado, muitas vezes pode ser essencial saber qual o tipo do dado de uma chave específica:

TYPE chave”: retorna o tipo de dado guardado na chave dada.

Trabalhando com Redis Strings

Os comandos para trabalhar com o tipo mais básico do Redis são SET e GET. Eles trabalham somente com valores do tipo Redis Strings e podem ser utilizados da seguinte forma:

SET chave value”: guarda o dado ‘value’ na chave dada.

GET chave”: retorna o valor associado à chave dada.

Existem várias opções extras que podem ser utilizadas, como EX que permite ao usuário escolher o tempo de expiração daquela chave. Se essa opção for omitida, a chave não expira.

Existe o comando “INCR chave”, que trata o dado na string como inteiro e faz o incremento do valor. Isso é útil para fazer um gerenciamento de valores auto-incrementais de id ou para o uso de contadores.

Trabalhando com Redis Lists

As listas no Redis são implementadas como listas ligadas, o que assegura velocidade de escrita na cabeça ou cauda e, em compensação, aumenta o tempo de leitura de posições específicas. Por isso, o uso de listas no Redis é um pouco específico e, ainda assim, útil.

Os comandos para criação de lista e adição de elementos são:

RPUSH chave v1 v2 v3 …”: adiciona os valores dados ao final da lista associada à chave dada.

LPUSH chave v1 v2 v3 …”: funciona como o RPUSH, mas adiciona os valores no começo da lista.

A leitura pode ser feita com dois comandos diferentes:

LRANGE chave comeco fim”: retorna uma sublista a partir das posições fornecidas.

LINDEX chave posicao”: retorna o valor da posição dada.

Ainda existem as operações de leitura que fazem a remoção dos elementos também:

LPOP chave”: retorna o valor do começo da lista e o remove.

RPOP chave”: retorna o valor do fim da lista e o remove.

Trabalhando com Redis Hash

Essa é a estrutura que normalmente é mais utilizada para guardar objetos no Redis, pois é possível fazer um paralelo campo a campo do seu objeto com o objeto guardado no Redis. Vale ressaltar que as chaves do tipo hash não seguem um esquema de dados fixo predeterminado, ou seja, cada chave contém um objeto que não necessariamente possui  os mesmo campos que os objetos que estão nas outras chaves.

É recomendado que as estruturas dos dados em chaves relacionadas sejam pelo menos parecidas, para facilitar a utilização do Redis no lado da aplicação, apesar de não ser um requisito para o funcionamento do Redis.

Os comandos para escrita são:

HSET chave campo valor”: salva o valor dado no campo dado no hash associado à chave dada.

HMSET chave c1 v1 c2 v2 …”: funciona como vários HSETs seguidos e é útil para salvar um objeto de uma só vez no Redis.

Suponha que temos o objeto json de usuário a seguir:

Uma forma de guardar esse dado no redis seria:

“HMSET users-302 id 302 name carlos”
ou com múltiplos HSET
“HSET user-302 id 302”
“HSET user-302 name carlos”

Um detalhe importante é que, ao user HSET ou HMSET em uma chave de hash já existente, os campos e valores dados serão adicionados ao objeto ou sobrescritos caso os campos já existam. Os campos e valores já existentes no objeto continuarão lá.

Então rodar “HSET user-302 city campinas” faria o nosso objeto de user passar a ser:

Desse modo, para fazer a deleção de um campo é necessário rodar:

HDEL chave campo”: deleta o campo que está salvo dentro do objeto hash associado à chave dada.

Para fazer a leitura das chave hash podemos rodar:

HGETALL chave”: retorna os campos e o valores associados à chave dada.

HGET chave campo”: retorna o valor associado ao campo da chave dada.

HMGET chave c1 c2 c3 …”: retorna os valores associados aos campos dados.

Trabalhando com Redis Sets

Os sets em Redis representam conjuntos de valores que não se repetem. Ao fazer uma adição de um elemento já existe em um set, o comando não faz nada com o set.

O comando de escrita em set é:

SADD chave valor”: tenta adicionar o valor dado à chave dada.

A leitura pode ser feita com os comandos:

SMEMBERS chave”: retorna todo o set.

SISMEMBER chave valor”: retorna se o valor dado está ou não no set.

Ainda é possível remover um elemento com:

SREM chave valor”: tenta remover o valor dado do set.

O mais interessante de usar Redis Sets é a possibilidade de utilizar operações de conjunto comumente vista na matemática como a união, interseção e diferença de conjunto.

A união de dois conjuntos resulta em um super conjunto que contém todos os elementos de cada um dos conjuntos originais.

A interseção de dois conjuntos resulta em subconjunto que contém somente os elementos que estão presentes nos dois conjuntos originais simultaneamente.

A diferença de dois conjuntos (conjunto A menos o conjunto B) resulta no subconjunto que contém os todos os elementos do primeiro conjunto (conjunto A) contudo exclui todos os elementos que estão presentes no segundo conjunto (conjunto B).

Essas operações podem ser feitas no Redis com os seguintes comandos:

SUNION chave1 chave2”: retorna a união dos sets das chaves dadas.

SINTER chave1 chave2”: retorna a interseção dos sets das chaves dadas.

SDIFF chave1 chave2”: retorna a diferença entre os sets dados.

Considerações finais

Esse artigo teve como objetivo mostrar as funcionalidade do Redis e dar dicas de como fazer sua utilização no desenvolvimento de aplicações. Vale lembrar que é de grande importância checar a documentação oficial para ter conhecimento de comandos mais específico e de modos de operação diferentes que podem ser especialmente úteis para sua aplicação.

Quer continuar estudando sobre o tema? Separamos algumas coisas :)

Deixe um comentário

%d blogueiros gostam disto: