Redis: Banco de dados em memória
Redis (Remote Dictionary Server / Servidor de Dicionário Remoto) é um banco de dados não relacional que armazena estruturas de dados em memória e pode assumir diferentes papéis no desenvolvimento de software, como cache, gerenciamento de sessões, classificações em tempo real, filas e message broker. As estruturas de dados fornecidas…
Redis (Remote Dictionary Server / Servidor de Dicionário Remoto) é um banco de dados não relacional que armazena estruturas de dados em memória e pode assumir diferentes papéis no desenvolvimento de software, como cache, gerenciamento de sessões, classificações em tempo real, filas e message broker.
As estruturas de dados fornecidas pelo Redis contemplam:
- Strings
- Hashes
- Listas
- Conjuntos
- Bitmaps
- HyperLogLogs
- Índices geoespaciais
- Streams
Vantagens
- Alta performance – excelente velocidade devido ao armazenamento de dados em memória principal (RAM) e estruturas de dados otimizadas.
- Baixa latência – tempo de resposta rápido.
- Persistência personalizável – é possível optar pela persistência para garantir a durabilidade dos dados, seja através de snapshots periódicos ou logs de transações.
- Suporte a estruturas de dados complexas.
Instalação
Na documentação oficial é possível encontrar o guia de instalação de acordo com o sistema operacional: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/
Comandos básicos
Após a instalação, podemos utilizar o redis-cli para interagir com o servidor Redis via console, dado isso, vamos testar alguns comandos relacionados às estruturas de dados de strings, hashes e listas.
Strings
Definindo o valor de uma chave
127.0.0.1:6379> SET chave 123
OK
Obtendo o valor de uma chave
127.0.0.1:6379> GET chave
"123"
Verificando se uma chave existe
127.0.0.1:6379> EXISTS key chave
(integer) 1
Deletando uma chave
127.0.0.1:6379> DEL chave
(integer) 1
Incrementando uma chave
127.0.0.1:6379> INCR numero
(integer) 1
Decrementando uma chave
127.0.0.1:6379> DECR numero
(integer) 0
Definindo tempo de expiração de uma chave
127.0.0.1:6379> SET chave abc
OK
127.0.0.1:6379> GET chave
"abc"
127.0.0.1:6379> EXPIRE chave 3
(integer) 1
127.0.0.1:6379> GET chave
(nil)
Hashes
Adicionando uma chave e um valor em um hash
127.0.0.1:6379> HSET hash nome maria
(integer) 1
Obtendo o valor de uma chave de um hash
127.0.0.1:6379> HGET hash nome
"maria"
Obtendo todas as chaves/valores de um hash
127.0.0.1:6379> HGETALL hash
1) "nome"
2) "maria"
Deletando uma chave de um hash
127.0.0.1:6379> HDEL hash nome
(integer) 1
Listas
Adicionando um valor no início da lista
127.0.0.1:6379> LPUSH lista A
(integer) 1
Adicionando um valor no final da lista
127.0.0.1:6379> RPUSH lista B
(integer) 2
Buscando os elementos da lista a partir de um range
127.0.0.1:6379> LRANGE lista 0 2
1) "A"
2) "B"
3) "C"
Deletando o primeiro valor da lista
127.0.0.1:6379> LPOP lista
"A"
Deletando o último valor da lista
127.0.0.1:6379> RPOP lista
"C"
Na página oficial do Redis (https://redis.io/docs/latest/commands/) é possível visualizar todos os comandos disponíveis, bem como o detalhamento de cada um deles.
Persistência
No arquivo redis.conf é possível configurar os tipos de persistências:
- RDB – realiza cópias periódicas do conjunto de dados nos intervalos especificados.
save 60 1000
Essa configuração faz com que o Redis salve o conjunto de dados no disco a cada 60 segundos, caso pelo menos 1.000 chaves tenham sido alteradas. Essa estratégia é conhecida como “snapshot”.
- AOF – registra cada operação de gravação recebida pelo servidor. Essas operações são reproduzidas na inicialização do servidor, reconstruindo o conjunto de dados original.
appendonly yes
Com essa configuração, toda vez que o Redis receber um comando que altere o conjunto de dados, ele o anexará ao AOF.
- Desativação da Persistência – a persistência pode ser completamente desativada, geralmente usada durante o armazenamento em cache.
- Combinação das persistências RDB e AOF.
Para verificar qual tipo de persistência está configurada em seu arquivo redis.conf, execute em um terminal:
- RDB
redis-cli CONFIG GET save
- AOF
redis-cli CONFIG GET appendonly
Implementando Redis em uma aplicação Ruby on Rails
No mundo real, muitos frameworks web populares possuem integração com o Redis, sendo assim, vamos criar um exemplo bem simples de uma aplicação para ilustrar como podemos configurar e utilizar o Redis com Ruby on Rails.
Primeiro criaremos um novo projeto, será um contador de visitas. Em um console basta executar:
rails new VisitCounterApp
cd VisitCounterApp
No arquivo Gemfile incluiremos a gem redis (https://github.com/redis/redis-rb):
gem 'redis'
Novamente em um console, dessa vez iremos prosseguir com a instalação da dependência:
bundle install
Em config/initializers vamos criar o arquivo redis.rb para inicializar o Redis globalmente sempre que a aplicação foi iniciada:
$redis = Redis.new(url: ENV['REDIS_URL'])
Através do console iremos criar uma controller de visitas:
rails generate controller Visits index
Configurar a rota em routes.rb:
Rails.application.routes.draw do
root 'visits#index'
end
Adicionar um template em index.html.erb para exibir a contagem de visitas:
<h1>Visita nº <%= @numero_visita %></h1>
E por fim, implementar a lógica de contagem. Cada acesso a página index de visitas fará com que a chave numero_visita existente no Redis seja incrementada em +1, no primeiro acesso a página, o Redis entende que o valor inicial é 0 por padrão, sendo assim não é necessário realizar nenhuma tratativa antes do primeiro incremento.
class VisitsController < ApplicationController
def index
@numero_visita = $redis.incr('numero_visita')
end
end
Para resetar a contagem de visitas podemos deletar a chave ou atribuir seu valor como 0:
rails c
$redis.set("numero_visita", 0)
$redis.del("numero_visita")
Considerações finais
Redis é um banco de dados em memória que oferece alta performance e baixa latência, ideal para aplicações como cache, gerenciamento de sessões e filas. Com suporte a diversas estruturas de dados, desde simples a complexas, sua instalação e integração são simples, tornando-o uma ferramenta poderosa e versátil para otimizar a performance de aplicações.
Referências:
- https://redis.io/about/
- https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/
- https://aws.amazon.com/pt/elasticache/what-is-redis
- https://www.ibm.com/br-pt/topics/redis