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, mas suporta tipos complexos de valor, isso 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.

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, a chave é usada para resgatar os valores guardados e é 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”, mas isso fica 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. Vamos focar nos comandos da forma que eles são utilizados no “cli“, mas os clientes implementados para as linguagens mais comuns têm 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 e 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, isso garante com que o Redis saiba guardar a informação fornecida  da forma mais correta para o tipo de dado, mas 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.

Mas algumas vezes é necessário saber se a chave existe ou se é necessário fazer a remoção da chave manualmente, e, para isso, é 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 necessário 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 a 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, isso garante velocidade de escrita na cabeça ou cauda, mas isso aumenta o tempo de leitura de posições específicas. Por isso, a uso de listas no Redis é um pouco específico, mas ainda assim útil.

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

RPUSH chave v1 v2 v3 …”: adicionar os valores dados ao final da lista associada a  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 para 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 seja pelo menos parecida, para facilitar a utilização do Redis no lado da aplicação, mas isso não é 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 de usuário json 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 o campo já existam. Os campos e valores já existentes no objeto continuarão lá.

Então rodar “HSET user-302 city campinas” faria 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 a 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”: tentar 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 união, interseção e diferença de conjunto.

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

A interseção de dois conjuntos resulta num 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) mas 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 🙂

Posted by:Rodolfo Bitu

Deixe seu comentário