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 NuGetPM> Install-Package StackExchange.Redis
ou para projectos strong-namedPM> Install-Package StackExchange.Redis.StrongName
Ligação à cache
Incluir a bilbioteca StackExchange.Redisusing 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 aquiPara 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.Jsonusing 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
Sem comentários: