Introdução às estruturas de dados do Redis

Bruno Dadalt Zambiazi
CWI Software
Published in
4 min readMay 19, 2019

O Redis é um dos bancos de dados NoSQL mais utilizados na atualidade e é bastante conhecido por sua natureza de alta performance. Uma de suas peculiaridades é o fato de armazenar seus dados como conjuntos de chave-valor, e o que muitos desenvolvedores desconhecem é que estas chaves podem armazenar valores em diversos formatos, dentre os quais Strings, Hashes, Lists e Sets.

É vital que o desenvolvedor conheça ao menos de forma básica cada uma destas estruturas de dados para conseguir tirar o máximo proveito da principal característica do Redis: seu alto desempenho.

Então vamos lá? :)

Strings

A estrutura de dados mais básica do Redis é a String, que aceita como valor qualquer dado binário de até 512 MB. Dentre os principais comandos dessa estrutura estão GET, SET e DEL, usados, respectivamente, para obter, setar e excluir chaves.

Exemplos:

redis-cli> set user "alfredlawson"
OK
redis-cli> get user
"alfredlawson"
redis-cli> del user
(integer) 1
redis-cli> get user
(nil)

A facilidade no uso de Strings, porém, pode levar o desenvolvedor a cometer um erro ao pensar em armazenar tudo dessa forma. Pode ser tentador, por exemplo, utilizar uma chave para cada informação referente a um usuário, algo como user:123:username e user:123:email.

O problema com esta abordagem é a quantidade excessiva de chaves que será gerada. Basta pensar no número de chaves que seria necessário armazenar para um sistema com um milhão de usuários no qual fossem armazenadas cinco ou dez informações para cada um deles.

A lista completa de comandos do Redis para Strings pode ser vista aqui.

Hashes

A maneira mais adequada para resolver o problema anterior é a utilização de um Hash. Hashes nada mais são do que mapeamentos entre chaves e seus respectivos valores, o que os tornam a melhor opção para representação de objetos com propriedades/atributos.

Exemplos:

redis-cli> hmset user:123 name "Isabelle" username "isabelle.davidson"
OK
redis-cli> hset user:123 email "isabelle.davidson@gmail.com"
(integer) 1
redis-cli> hgetall user:123
1) "name"
2) "Isabelle"
3) "username"
4) "isabelle.davidson"
5) "email"
6) "isabelle.davidson@gmail.com"
redis-cli> hget user:123 name
"Isabelle"

O Redis trata os Hashes de uma maneira especial, armazenando-os de forma com que ocupem muito menos espaço do que uma estrutura semelhante representada em várias Strings.

Voltando ao exemplo dos usuários, um milhão de Hashes (cada um representando um usuário) com cinco chaves em cada (cinco informações por usuário) são armazenados num espaço de memória muito menor do que cinco milhões de chaves distintas representando as mesmas informações como Strings.

A lista completa de comandos do Redis para Hashes pode ser vista aqui.

Lists

A List representa uma coleção de elementos ordenados e não exclusivos e acaba sendo, portanto, a opção adequada para agrupar valores quando não é necessário se preocupar com valores repetidos. O Redis trata as Lists basicamente como listas encadeadas, tornando práticas e performáticas as operações de inserção e remoção de elementos, tanto no início (LPUSH e LPOP) quanto no final (RPUSH e RPOP) da estrutura.

Exemplos:

redis-cli> rpush ranking "start" "last"
(integer) 2
redis-cli> lpop ranking
"start"
redis-cli> llen ranking
(integer) 1
redis-cli> lpush ranking "first"
(integer) 2
redis-cli> lindex ranking 0
1) "first"
redis-cli> lrange ranking 0 -1
1) "first"
2) "last"

O Redis possui comandos avançados que possibilitam, por exemplo, realizar operações bloqueantes de leitura (BLPOP, BRPOP e BRPOPLPUSH) até que seja inserido algum valor na lista.

Esse tipo de funcionalidade faz com que as Lists sejam uma opção interessante para implementação de sistemas simples de mensageria e até mesmo para serem a base de frameworks de processamento de tarefas em segundo plano.

A lista completa de comandos do Redis para Lists pode ser vista aqui.

Sets

Assim como um List, o Set também é uma coleção de dados. A diferença entre eles reside no fato de que um Set é uma coleção de dados únicos/exclusivos e não ordenados.

Exemplos:

redis-cli> sadd users "mario" "mario" "mario" "mitchell" "tanya"
(integer) 3
redis-cli> sadd users "garrett"
(integer) 1
redis-cli> scard users
(integer) 4
redis-cli> sadd users "tanya"
(integer) 0
redis-cli> smembers users
1) "mario"
2) "garrett"
3) "mitchell"
4) "tanya"

Além das operações triviais demonstradas no exemplo, o Redis também possui comandos para gerar novos Sets baseados em intersecção (SINTERSTORE), união (SUNIONSTORE) e diferença (SDIFFSTORE) entre mais de um Set.

A lista completa de comandos do Redis para Sets pode ser vista aqui.

Sorted Sets

Como o próprio nome indica, o Sorted Set é um Set com ordenação. Nesta estrutura de dados únicos, todos os elementos precisam ter um score numérico associado, que será utilizado para automaticamente ordenar a coleção (do menor para o maior).

Exemplos:

redis-cli> zadd user:ranking 50 "gary"
(integer) 1
redis-cli> zadd user:ranking 100 "heather"
(integer) 1
redis-cli> zadd user:ranking 80 "jeff"
(integer) 1
redis-cli> zrange user:ranking 0 -1
1) "gary"
2) "jeff"
3) "heather"
redis-cli> zrangebyscore user:ranking 90 100
1) "heather"

O Sorted Set é a estrutura de dados do Redis que possui o maior número de comandos e suas operações são muito eficientes, o que o torna extremamente flexível para diversos casos de uso em que é necessário filtrar um conjunto de dados de maneira rápida.

A lista completa de comandos do Redis para Sorted Sets pode ser vista aqui.

Muitos desenvolvedores acostumam-se a utilizar somente uma ou duas das estruturas de dados apresentadas, seja por desconhecimento ou mesmo por comodidade, perdendo, assim, a possibilidade de desfrutar das vantagens que a ferramenta proporciona.

Este artigo dá uma visão simplificada sobre as principais estruturas de dados do Redis, mas vale ressaltar que ainda existem outras bastante interessantes. Cabe ao desenvolvedor conhecê-las e saber como aplicá-las de modo apropriado para tirar o máximo proveito de tudo o que o Redis pode oferecer.

Até o próximo artigo :)

--

--