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:

0 Comentário