DevSecOps

26 mar, 2015

Conhecendo o cache Redis do Azure

Publicidade

Vamos falar sobre cache, Redis, Azure e como fica tudo isso quando usamos o Cache Redis do Azure. Mas, primeiro, vamos entender o que é o Redis.

Redis

Essa é a descrição do site oficial: “Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs”.

Em outras palavras, Redis é um cache em memória que faz mais do que um cache normal (como o memcached) e menos que um banco de dados NoSql (como o MongoDB). O Redis preenche esse campo intermediário e funciona muito bem como um armazenamento chave-valor, mas também aceita outras estruturas de dados, como Lists, Sets, Sorted Sets, Hashes e Bitmap. Além disso, também tem outras funcionalidades como transações e pubsub.

Mas apesar de ter tudo disso, ainda é um cache em memória, ou seja, se o serviço parar, todos os dados são perdidos*. É importante saber que Redis é otimizado para ter uma latência baixíssima e pode não estar sempre consistente. É o que se chama de consistência eventual.

O Redis consegue persistir os dados de memória de diversas maneiras (documentação), mas isso ainda não é suportado pelo cache Redis do Azure. Já existe um pedido no uservoice pra habilitar isso.

Cache Redis do Azure

O Redis é muito legal e você pode criar uma máquina virtual com Ubuntu e Redis no Azure e já sair usando. Mas você ainda é responsável por aplicar todas as futuras atualizações e configurar o Redis. Pra resolver esse problema, o Azure oferece o Redis como serviço totalmente gerenciado pela Microsoft.

Usando o cache Redis do Azure, você ganha o monitoramento do cache de graça e no plano standard, você tem replicação automática (Master/Slave).

Criando um cache Redis no Azure

O cache Redis do Azure só pode ser criado pelo novo portal, então vamos lá!

Para começar, vamos criar o serviço:

redis--1-

Depois preencher as configurações:

redis--2-

Quando você clicar em “OK”, pode demorar alguns minutos até a criação do cache Redis, já que, por trás dos panos, uma máquina virtual dedicada ao seu serviço está sendo criada.

Ok, cache Redis criado. Por padrão, o monitoramento vem desabilitado. Para habilitar, clique em qualquer aviso de monitoramento desabilitado e selecione a conta de Armazenamento para salvar os logs.

redis--4-

Os custos de armazenamento se aplicam aqui, por isso você pode configurar a retenção desses logs pelo tempo que julgar apropriado.

Não se esqueça de usar uma conta de armazenamento que esteja na mesma região do cache Redis para evitar custos de transferência de dados entre regiões. Isso vale pra todos os serviços do Azure.

Agora podemos interagir com nosso cache.

Usando o Redis

Não existe diferença entre ultlizar o Redis na sua máquina ou no Azure, por isso você pode rodar os mesmos comandos em qualquer instância do Redis – rodando no Linux, Windows, Azure ou qualquer outro lugar. No site oficial, tem uma lista de clientes para utilizar o cache Redis.

Para acessar qualquer cache Redis com autenticação, precisamos utilizar o hostname e a senha. No caso do cache Redis do Azure, o hostname fica na aba properties:

redis--5-

redis--6-

Já a senha, podemos encontrar na aba keys. Podemos usar tanto a chave primária quanto secundária como senha:

redis--7-

redis--8-

.NET

Para utilizar o cache Redis usando .NET, vamos utilizar o pacote nuget StackExchange.Redis. Depois de instalar o pacote no seu projeto, continue.

using System;
using StackExchange.Redis;

namespace ConsoleApplication1
{
  public class Program
  {
    private static void Main()
    {
      var conexao = @"testeblog.redis.cache.windows.net, ssl=true, password=e3zFsDIv0gWnThaXV6bydaCmGQBNP/55b2W1M/ZJ8UA=";
      using (var connection = ConnectionMultiplexer.Connect(conexao))
      {
        var cache = connection.GetDatabase();

        cache.StringSet("chave", "valor");
        cache.StringSet("outra-chave", 10);

        var chave = cache.StringGet("chave");
        var outraChave = (int) cache.StringGet("outra-chave");

        Console.WriteLine("chave: {0}", chave);
        Console.WriteLine("outra-chave: {0}", outraChave);
      }
    }
  }
}

Outros clientes

Todos os outros clientes conseguem se comunicar com o Azure Redis sem problemas, mas tem um porém: o Redis não suporta SSL e, por padrão, o cache Redis do Azure vem somente com a porta SSL habilitada. Deadlock, né? Felizmente, temos como habilitar a porta normal no portal. Basta clicar em Access ports e habilitar a porta sem SSL:

redis--9-

redis--10-

Agora conseguimos conectar todos os clientes que não suportam SSL.

Node.js

Para utilizar o cache Redis com Node.js, vou utilizar a lib node_redis. Para instalar, instale o pacote pelo npm: npm install redis. Obviamente, você tem que ter o Node.js instalado.

var redis = require('redis');
var client = redis.createClient(6379, 'testeblog.redis.cache.windows.net', {
  auth_pass: 'e3zFsDIv0gWnThaXV6bydaCmGQBNP/55b2W1M/ZJ8UA='
});
var callback = function(erro, resposta) {
  if(!erro) {
    console.log(resposta);
  }
};

client.set('chave-node', 'valor-node', callback);
client.set('outra-chave-node', 20, callback);
client.get('chave-node', callback);
client.get('outra-chave-node', function(e, r) {
  callback(e, r);
  client.end();
});

Linha de comando

Para utilizar o cache Redis via linha de comando, vou instalar o redis-cli via Chocolatey:

c:\>choco install redis-64
Chocolatey (v0.9.8.33) is installing 'redis-64' and dependencies. By installing you accept the license for 'redis-64' and each dependency you are installing.

Finished installing 'redis-64' and dependencies - if errors not shown in console, none detected. Check log for errors if unsure.

c:\>redis-cli -h testeblog.redis.cache.windows.net -a e3zFsDIv0gWnThaXV6bydaCmGQBNP/55b2W1M/ZJ8UA=
testeblog.redis.cache.windows.net:6379> ping
PONG
testeblog.redis.cache.windows.net:6379> set "chave-cmd" "valor-cmd"
OK
testeblog.redis.cache.windows.net:6379> get "chave-cmd"
"valor-cmd"
testeblog.redis.cache.windows.net:6379> get "chave"
"valor"
testeblog.redis.cache.windows.net:6379> get "chave-node"
"valor-node"
testeblog.redis.cache.windows.net:6379> exit

Monitoramento

Depois de testar com vários clientes, já podemos começar a ver todo o monitoramento acontecendo no portal. Depois de alguns loops adicionando e lendo chaves, conseguimos ver várias métricas importantes.

redis--11-

Finalizando

E aí, curtiu? O bom do Redis é que você não precisa deixar de usar nada do que já usa pra começar a utilizá-lo. Dá pra começar a usar o Redis pra resolver gargalos de performance pouco a pouco e deixar seu app melhor, mais rápido e responsivo!

E você, tem um case pra utilizar o Redis? Eu adoraria conhecer!