Redis Caching


Redis é um motor de base de dados em memória com armazenamento baseado em tabelas de hash (key-value).

O cliente .NET StackExchange.Redis é amplamente usado pelas suas características votadas à alta performance e foi desenvolvido pela equipa da Stack Exchange. Documentação completa do cliente StackExchange.Redis aqui.

Instalação dos clientes da cache
Instalação pela consola NuGet
PM> Install-Package StackExchange.Redis
ou para projectos strong-named
PM> Install-Package StackExchange.Redis.StrongName

Ligação à cache
Incluir a bilbioteca StackExchange.Redis
using StackExchange.Redis;
A ligação à Cache do Redis é gerida pela classe ConnectionMultiplexer. Esta classe deve ser partilhada e reutilizada em toda a aplicação cliente e não precisa de ser criada para cada operação.
ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(<connectionstring>);

Exemplo de connection string Azure
<azure redis cache id>.redis.cache.windows.net:6380,password=<pwd>,ssl=True,abortConnect=False
Se não se pretender utilizar o protocolo SSL, definir ssl=false ou omitir o parâmetro ssl.
O abortConnect está definido como falso, o que significa que a chamada terá êxito mesmo se não for estabelecida uma ligação à Cache do Redis do Azure. Uma funcionalidade-chave do ConnectionMultiplexer consiste no restauro automático da conectividade à cache assim que o problema de rede ou outros problemas tiverem sido resolvidos.

Uma abordagem para partilhar uma instância ConnectionMultiplexer consiste em ter uma propriedade estática que devolva uma instância ligada, tal como no exemplo seguinte. Esta abordagem fornece uma forma segura para as threads de modo a inicializar apenas uma única instância ConnectionMultiplexer ligada.
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
        {
            return ConnectionMultiplexer.Connect(ConfigurationManager.ConnectionStrings["RedisCache"].ConnectionString);
        });

        public static ConnectionMultiplexer Connection
        {
            get
            {
                return lazyConnection.Value;
            }
        }
Documentação detalhada da configuração do cliente StackExchange.Redis aqui

Para ser colocado em cache, o objecto .NET tem de ser serializado.

Uma forma simples de serializar objectos passa por utilizar os métodos de serialização JsonConvert da framework Newtonsoft.Json.NET e serializar de e para JSON.
Documentação da framework Json.NET aqui.

Instalação pela consola NuGet
PM> Install-Package Newtonsoft.Json
Incluir a bilbioteca Newtonsoft.Json
using Newtonsoft.Json;

Uma alternativa é usar uma extensão como o StackExchange.Redis.Extender que trata da serialização de e para JSON do StackExchange.Redis. Projecto disponível aqui.


Exemplo de Utilização
Adcionar ao App.config
<connectionStrings>
    <add name="RedisCache" connectionString="<azure redis cache id>.redis.cache.windows.net:6380,password=<pwd>,ssl=True,abortConnect=False"/>
  </connectionStrings>

Obtenção das credenciais
System.Configuration.ConfigurationManager.ConnectionStrings["RedisCache"].ConnectionString);

POCO
 public class Author
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Course> Courses { get; set; }
    }

    public class Course
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public int Level { get; set; }
        public float FullPrice { get; set; }
        public int AuthorId { get; set; }
        public bool IsBeginnerCourse
        {
            get { return Level == 1; }
        }
        public virtual Author Author { get; set; }
    }

Método AddAuthor
 static Author AddAuthor()
        {

            return new Author
            {
                Id = 1,
                Name = "Silvia Pinhao Lopes",
                Courses = new List<Course>
  {
   new Course
   {
    AuthorId = 1,
    Description = "First Course",
    FullPrice = 12,
    Id = 1,
    Level = 1,
    Name = "1st Course"
   }
  }
            };
        }

Invocação
static void Main(string[] args)
        {
            IDatabase cache = Connection.GetDatabase();
            IEnumerable authors;

            var cAuthorKey = "authors";

            RedisValue lstAuthors = cache.StringGet(cAuthorKey);

            if (!lstAuthors.HasValue)
            {
                authors = new List<Author> { AddAuthor() };

                cache.StringSet(cAuthorKey, value: JsonConvert.SerializeObject(authors, Formatting.Indented), expiry: TimeSpan.FromMinutes(2));
            }
            else
            {
                Console.WriteLine("Cache hit");
                authors = JsonConvert.DeserializeObject<IEnumerable<Author>>(lstAuthors);
            }

            foreach (var author in authors)
            {
                Console.WriteLine(author.Name);
            }

            Console.Read();

        }



Referências: Como Utilizar a Cache de Redis do Azure, Azure: Redis Cache




Para instalação local do servidor Redis ver artigo Distributed Caching using Redis Server with .NET/C# Client

Licença CC BY-SA 4.0 Silvia Pinhão Lopes, 27.10.17
Print Friendly and PDF

Sem comentários:

Com tecnologia do Blogger.