Concrete Logo
Hamburger button

Redis – Parte 1

  • Blog
  • 9 de Janeiro de 2013
Share

Dando continuidade à série sobre NoSQL, iniciada neste blog com o post sobre Amazon DynamoDB, hoje vou iniciar uma série de posts sobre o Redis, passando por detalhes básicos de instalação e utilização, além de aspectos avançados como alta disponibilidade e escalabilidade.

1 – O que é?

O Redis é um storage de dados schemaless, do tipo tuple store ou key-value store, projetado para armazenar dados na memória RAM e permitir acesso fácil e extremamente rápido de qualquer informação, através de uma API bastante rica e simples de usar. O Redis também é referenciado, em muitas literaturas, como um data structure server, por permitir o armazenamento de dados simples, como Strings e números, até estruturas de dados complexas, como Lists, Sets, Hashes e Sorted Sets.

Dados na memória? Já existe o Memcached, por exemplo. Qual a vantagem?

Não sendo apenas um simples porém poderoso storage de dados na RAM, como o Memcached, o Redis também implementa alguns recursos adicionais ao Memcached, como transactions e publish–subscribe pattern. Isto permite seu uso de forma mais robusta e versátil, em vários contextos de aplicação.

E quanto à segurança e acesso a dados sigilosos?

Como um serviço de rede, o Redis vai expor uma porta para conexões na interface de rede, quando executado. Algumas regras gerais e básicas de segurança (bind no localhost, iptables, etc) sempre são válidas, porém o Redis vai um pouco além e permite que conexões sejam autenticadas antes que qualquer query seja executada. Você pode consultar aqui um guia de boas práticas de segurança com Redis.

Meus dados estão na RAM. E se o serviço parar?

Caso o administrador precise garantir a persistência das informações do dataset, com fácil recuperação entre eventuais reboots do serviço ou servidor, o Redis suporta duas estratégias diferentes de backup/restore automático do dataset:

Snapshotting: Grava o estado completo da memória em um arquivo no disco, em intervalos de tempo pré-configurados. Caso o Redis seja reiniciado, o estado inicial do dataset é restaurado a partir deste arquivo. É possível instruir o Redis a gerar novo snapshot quando houver, ao menos, N alterações de dados no dataset.

Log appending: A cada nova instrução que modifica o dataset, proveniente de qualquer cliente conectado, a mesma é gravada em um arquivo de log no disco. Caso o Redis seja reiniciado, o dataset é reconstruído a partir deste log, com a execução das instruções gravadas.

Cada estratégia aborda a persistência do dataset de maneira diferente, cada uma oferecendo vantagens e desvantagens de uso em ambientes de produção. As melhores práticas de persistência com Redis podem ser consultadas aqui.

Parece bom. É fácil de integrar com minha aplicação?

Graças ao apoio da comunidade, existem clients disponíveis para integrar o Redis com a grande maioria das plataformas de desenvolvimento, como Java, .NET, Ruby, Python, etc. A lista completa de clients está disponível aqui.

Neste post, vou demonstrar a integração com o Redis usando Java e Ruby. Mas antes disso, vamos abordar a instalação do Redis.

2 – Instalação

A implementação oficial do Redis está disponível para instalação nas plataformas Linux, OSX e *BSD. Extraoficialmente, existem ports para win32/64, ainda não homologados para uso em produção. Consulte aqui e aqui. Neste post, mostrarei como instalar o Redis no Ubuntu, versão 12.04. Todos os exemplos deste post também serão executados neste SO.

Baixando, compilando e instalando

O Redis pode ser facilmente instalado a partir de pacotes nativos para Debian e outras distros Linux, mas normalmente tais versões estão defasadas nos repositórios oficiais. Por conta disso, adotaremos a instalação da última versão estável, a partir do código-fonte. O processo é bastante simples e rápido. Antes de prosseguir, instale algumas dependências:

[sourcecode language=”bash”]
$ sudo apt-get update
$ sudo apt-get install build-essential automake tcl8.5-dev
[/sourcecode]

Se tudo estiver certo, basta fazer download do bundle mais recente e iniciar a instalação:

[sourcecode language=”bash”]
$ wget https://redis.googlecode.com/files/redis-2.6.7.tar.gz
$ tar xzf redis-2.6.7.tar.gz
$ cd redis-2.6.7
$ make
$ sudo make install
[/sourcecode]

Tudo certo? Já pode testar a instalação, iniciando o server:

[sourcecode language=”bash”]
$ redis-server &
[/sourcecode]

Com a instalação do server, também está disponível o client básico para interação com o serviço em execução. Com o server rodando, execute:

[sourcecode language=”bash”]
$ redis-cli
[/sourcecode]

A partir daí, você pode executar qualquer comando válido para o Redis, como inserção de listas, hashes, etc. Tal comando será aplicado na instância onde o client está conectado (por padrão, localhost:6379). Consulte aqui a referência completa de comandos do Redis.

Certamente, a instalação do Redis em ambiente de produção deve seguir alguns passos adicionais, como instalação de init scripts e configurações de log level, daemon, etc. Se você pretende usar o Redis em produção, consulte aqui o guia de boas práticas adicionais para esta finalidade.

Em produção, alguns aspectos como alta disponibilidade e escalabilidade são essenciais para o sucesso de um produto de software. Abordaremos estes aspectos e suas estratégias de implementação para o Redis nos próximos posts desta série.

3 – Integrando ao seu código

Integrar uma aplicação ao Redis é tão simples quanto instalar o serviço em si. Basta instalar o client adequado à sua plataforma e utilizar o serviço, conectando ao servidor, executando comandos, etc.

Java

Se sua aplicação está escrita em Java, existem vários clients disponíveis para a plataforma. O atualmente recomendado pelo próprio time do Redis é o Jedis. Para utilizá-lo, baixe aqui a versão mais recente da biblioteca, que nesse momento é a versão 2.1.0.

Em seguida, crie um arquivo com o nome “JedisExample.java”, usando o editor de texto ou IDE de sua preferência no path onde você fez download do Jedis, conforme o exemplo abaixo:

TIP: Assumo que você possui o Java SDK instalado corretamente, certo? 😉

[sourcecode language=”java”]
import redis.clients.jedis.*;
import java.util.Arrays;

public class JedisExample {
public static void main(String[] args) {
Jedis jedis = new Jedis(“localhost”);
jedis.flushAll();

jedis.set(“foo”, “bar”);
String value = jedis.get(“foo”);
System.out.println(“Valor de foo: ” + value);

for (int i = 1; i <= 10; i++) {
jedis.rpush(“intlist”,String.valueOf(i));
}

System.out.println(“Lista de inteiros: ” + Arrays.toString(jedis.lrange(“intlist”,0,-1).toArray()));
}
}
[/sourcecode]

Tudo pronto? Vamos compilar e executar o exemplo:

TIP: Verifique se o Redis está em execução no host e porta padrão (localhost:6379) antes de executar o exemplo, ok?

[sourcecode language=”bash”]
$ javac -classpath ./jedis-2.1.0.jar JedisExample.java
$ java -classpath ./jedis-2.1.0.jar:. JedisExample
[/sourcecode]

Se tudo deu certo, você verá a saída do programa conforme abaixo:

[sourcecode language=”bash”]
Valor de foo: bar
Lista de inteiros: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[/sourcecode]

Pronto! Agora você tem uma aplicação Java integrada ao Redis. Simples, não acha? Claro que este exemplo é bastante minimalista. Aplicações do mundo real são mais complexas e melhor gerenciadas e mantidas, incluindo o uso de ferramentas de gerenciamento do build, como o Maven por exemplo. Se você utiliza Java e Maven em projetos profissionais, utilizar o Jedis é fácil. Basta adicionar a dependência no arquivo pom.xml do seu projeto, conforme abaixo:

[sourcecode language=”xml”]
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.1.0</version>
</dependency>
[/sourcecode]

O Jedis possui vários outros recursos interessantes, além da API para execução de comandos do Redis. Consulte a wiki do Jedis para mais informações.

Ruby

No mundo Ruby, também é bastante simples a integração de qualquer aplicativo ao Redis. Para esta plataforma, vamos reproduzir o exemplo feito em Java neste post, agora utilizando o client redis-rb, disponível no RubyGems.

TIP: Você tem o Ruby instalado, certo? Se não possui, consulte aqui antes de prosseguir.

Vamos começar pela instalação da biblioteca:

[sourcecode language=”bash”]
$ sudo gem install redis
[/sourcecode]

Depois, crie um arquivo com o nome “redis_example.rb” no diretório corrente e adicione o conteúdo abaixo:

[sourcecode language=”ruby”]
require ‘redis’

redis = Redis.new
redis.flushall

redis.set ‘foo’, ‘bar’
puts “Valor de foo: #{redis.get ‘foo’}”

(1..10).each { |i| redis.rpush ‘intlist’, i }

puts “Lista de inteiros: #{redis.lrange ‘intlist’, 0, -1}”
[/sourcecode]

Salvou o arquivo? Agora vamos fazer funcionar!

TIP: O Redis (localhost:6379) está em execução?

[sourcecode language=”bash”]
$ ruby ./redis_example.rb
[/sourcecode]

Tudo certo e a saída do exemplo será:

[sourcecode language=”bash”]
Valor de foo: bar
Lista de inteiros: [“1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”]
[/sourcecode]

4 – Concluindo

Neste momento, acredito que você concorde comigo sobre o quão simples é o processo de incorporação do Redis no stack de tecnologias de qualquer projeto de software. Não acha?

Além da facilidade de instalação e uso, o Redis também é bastante versátil, podendo ser utilizado como caching engine, realtime metrics storage e muitas outras maneiras.

No próximo post da série, falaremos sobre persistência e replicação de dados com Redis, abordando estratégias e sugestões de implementação.