18 de outubro de 2021

Utilizando conjuntos no Redis

O Redis é um dos projetos mais interessantes que já usei desenvolvendo software. Por ser um banco de dados em memória sua velocidade é bem alta e a versatilidade dele muito grande. Utilizo ele mais comumente para o armazenamento de cache, principalmente objetos serializados em sequências de bytes (ou seja, um JSON sem formatação), mas a utilidade dele vai muito além disso pois permite armazenar diversas outras estruturas mais complexas e uma das que me deparei utilizando recentemente foram os conjuntos.
 
O meu caso de uso era bem simples, eu precisava armazenar diversos códigos únicos fornecidos por uma API em uma estrutura que seriam utilizados posteriormente, eles não poderiam ser usados duas vezes e eu não poderia criar uma estrutura em um banco relacional comum (e nem precisava), por isso decidimos usar conjuntos do Redis, que além de atender de maneira simples nosso problema também resolvia alguns problemas de concorrência que eu poderia ter com bancos relacionais, pois não estávamos afim de gerenciar um bloqueio de registro para garantir que ele não fosse usado por outra thread da aplicação e esse problema já vinha resolvido de brinde pelo fato do Redis ser single-threaded.

Conjuntos são objetos matemáticos que agrupam outros objetos com características em comum. Quando implementam estes objetos nas linguagens de programação e bancos de dados é comum termos acesso a algumas operações e características que tornam estas estruturas muito úteis. A primeira característica é que todos os elementos de um conjunto são únicos, ou seja, não se repetem, além disso é comum termos operações de inserção (add), remoção (pop), verificar se um elemento consta no conjunto e operações entre conjuntos como interseção e união.

Primeiro iremos inserir alguns elementos no nosso conjunto com a operação SADD:

127.0.0.1:6379> SADD turma_da_monica Monica Cebolinha Cascão Magali
(integer) 4
127.0.0.1:6379> 

Agora podemos fazer algumas operações, vamos verificar o tamanho do conjunto, ou melhor dizendo, sua cardinalidade com o SCARD:

127.0.0.1:6379> SCARD turma_da_monica
(integer) 4
127.0.0.1:6379>

Vamos verificar se um elemento faz parte do conjunto com SISMEMBER:

127.0.0.1:6379> SISMEMBER turma_da_monica Batman
(integer) 0
127.0.0.1:6379>

Quando o elemento está no conjunto é retornado 1, caso não é retornado 0. Podemos também remover um elemento qualquer do conjunto com o SPOP, mas é importante lembrar que o valor retornado não segue nenhum critério, pois conjuntos não possuem a obrigação de ter nenhuma ordem, ao contrário de listas:

127.0.0.1:6379> SPOP turma_da_monica
"Magali"
127.0.0.1:6379>

Depois de removido podemos ver quais os membros que ainda compõem o conjunto com o SMEMBERS:

127.0.0.1:6379> SMEMBERS turma_da_monica
1) "Cebolinha"
2) "Casc\xc3\xa3o"
3) "Monica"
127.0.0.1:6379>

Além destas operações básicas os conjuntos do Redis também suportam operações como verificar interseção de conjuntos (elementos comuns em dois ou mais conjuntos), união (literalmente juntar conjuntos em um novo conjunto) e muito mais, vale apena conferir o manual das operações pois o mesmo é muito simples e fácil de entender. O mais importante é saber que o Redis suporta muito mais estruturas do que usamos habitualmente e é uma ferramenta incrível.

Nenhum comentário:

Postar um comentário