Implementando cache distribuído no ASP.NET Core \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 13 Horas 

 34 Min 

 31 Seg 

   Tempo restante da oferta: 13 34 31 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Implementando cache distribuído no ASP.NET Core  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# Implementando cache distribuído no ASP.NET Core

 Veja como é simples implementar cache distribuído no ASP.NET Core, utilizando o Redis ou o SQL Server.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/09/CACHE-DISTRIBUÍDO-ASP-NET.png)  

No artigo passado vimos como [implementar cache de memória em uma aplicação ASP.NET Core](https://www.treinaweb.com.br/blog/implementando-cache-de-memoria-no-asp-net-core/). Entretanto, este tipo de cache não fornece bons resultados quando há mais de uma instância da aplicação, por exemplo, quando é publicada em PaaS. Para este cenário pode ser utilizado cache distribuído.

## Cache distribuído

Cache distribuído é um cache compartilhado entre as instâncias de uma aplicação. Tipicamente gerenciado por um serviço externo que a aplicação acessa. Este tipo de cache pode melhorar a performance da aplicação, além de facilitar a sua escalabilidade.

Quando se trabalha com cache distribuído, o dado:

- É coerente (consistente) entre as requisições pelos vários servidores da aplicação;
- Não se perde se a aplicação reiniciar;
- Não utiliza a memória local.

No [ASP.NET Core](https://www.treinaweb.com.br/blog/o-que-e-o-asp-net-core/) o cache distribuído pode ser implementado, utilizando SQL Server, [Redis](https://redis.io/) ou serviços de terceiro, como o [NCache](https://www.alachisoft.com/ncache/). Como o NCache é uma biblioteca paga, não irei abordá-la neste artigo. No caso das outras duas formas, começaremos nosso estudo pelo Redis.

## O que é o Redis?

O [Redis](https://redis.io/) é um banco de dados estruturados em memória, open source, que pode ser utilizado como database, cache e/ou mensageria. O seu uso mais comum é como sistema de cache e é como o utilizaremos neste artigo.

Para que seja utilizado é necessário que o Redis esteja instalado na máquina atual ou em algum servidor. O seu instalador pode ser obtido [no site dele](https://redis.io/download). Entretanto, neste artigo farei uso a versão “containeralizada”, via [Docker](https://www.treinaweb.com.br/blog/no-final-das-contas-o-que-e-o-docker-e-como-ele-funciona/).

Com isso, caso tenha o Docker instalado na sua máquina, o Redis pode ser inicializado com o comando abaixo:

```shell
docker run --name local-redis -p 6379:6379 -d redis

```

Como Docker não é o foco deste artigo, não expliquei o comando acima, nele o importante é a porta definida no host local (`6379`), pois ela será informada no ASP.NET Core.

## Implementando cache distribuído no ASP.NET Core

Assim como o cache de memória, o cache distribuído é implementado via uma interface, a `IDistributedCache`. Entretanto o ASP.NET não fornece uma implementação padrão para esta interface, cada uma das implementações de cache distribuído são fornecidas via pacotes NuGet.

No caso do Redis, é necessário adicionar na aplicação o pacote `Microsoft.Extensions.Caching.StackExchangeRedis`:

```shell
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

```

Em seguida é necessário registrá-lo no método `ConfigureServices` da classe `Startup`:

```csharp
public void ConfigureServices(IServiceCollection services)
{
    //...

    services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = "localhost:6379";
    });
}

```

Com isso, a implementação da interface `IDistributedCache` será “injetada” das dependências da aplicação e poderá ser acessada no construtor:

```csharp
public class ProductsController : Controller
{
    private readonly IDistributedCache _cache;

    public ProductsController(IDistributedCache cache)
    {
        _cache = cache;
    }
}

```

[  ![C# (C Sharp) - Introdução ao ASP.NET Core](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) - Introdução ao ASP.NET Core Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-avancado-introducao-ao-aspnet-core)

Para ter acesso a um valor do cache podemos utilizar os métodos `Get`, `GetAsync`, que retorna o valor como um array de bytes; ou `GetString`, `GetStringAsync`, que o retorna como uma string:

```csharp
public async Task Index()
{
    var cacheKey = "Products";
    var products = new List();

    var json = await _cache.GetStringAsync(cacheKey);
    if(json != null)
    {
        products = JsonSerializer.Deserialize(json);
    }

    return View(products);
}

```

Já para salvar um valor no cache, também temos quatro métodos: `Set` e `SetAsync`, que salva o valor como um array de bytes; e `SetString` e `SetStringAsync` que o salva como uma string:

```csharp
public async Task Index()
{
    var cacheKey = "Products";
    var products = new List();

    var json = await _cache.GetStringAsync(cacheKey);
    if(json != null)
    {
        products = JsonSerializer.Deserialize(json);
    }
    else {
        products = await _context.Products.ToListAsync();
        json = JsonSerializer.Serialize(products);
        await _cache.SetStringAsync(cacheKey, json);
    }

    return View(products);
}

```

Caso queira, também é possível remover o item do cache com os métodos `Remove` e `RemoveAsync`.

## Definindo uma expiração para o cache

Pela nossa configuração atual, podemos correr o risco de ter dados obsoletos no cache, já que não está sendo definido nenhum prazo de expiração dos dados salvos nele. Podemos fazer isso utilizando a classe `DistributedCacheEntryOptions`:

```csharp
products = await _context.Products.ToListAsync();
json = JsonSerializer.Serialize(products);

var options = new DistributedCacheEntryOptions()
                .SetSlidingExpiration(TimeSpan.FromSeconds(20))
                .SetAbsoluteExpiration(TimeSpan.FromMinutes(1));

await _cache.SetStringAsync(cacheKey, json);

```

Agora o cache poderá ficar inativo até 20 segundos e será removido depois de um minuto. O tempo do “SlidingExpiration” também pode ser reiniciado com os métodos `Refresh` e `RefreshAsync`.

## Implementando cache distribuído com SQL Server

Caso tenha intenção de utilizar o SQL Server no lugar do Redis como cache distribuído, inicialmente é necessário executar o comando abaixo:

```shell
dotnet sql-cache create   

```

Para criar no banco a tabela que será utilizada para armazenar os dados do cache.

Em seguida, adicione no projeto o pacote `Microsoft.Extensions.Caching.SqlServer`:

```shell
dotnet add package Microsoft.Extensions.Caching.SqlServer

```

E por fim, configure o cache no método `ConfigureServices` da classe `Startup`:

```csharp
public void ConfigureServices(IServiceCollection services)
{
		//....
    services.AddDistributedSqlServerCache(options =>
    {
        options.ConnectionString = "";
        options.SchemaName = ;
        options.TableName = ;
    });
}

```

Note que nesta configuração devem ser informados os mesmos dados passados no comando `dotnet sql-cache create`.

O uso deste tipo de cache não difere do que vimos com o Redis.

## Conclusão

Como o [cache de memória](https://www.treinaweb.com.br/blog/implementando-cache-de-memoria-no-asp-net-core/) deve ser evitado em uma aplicação “multi-servidor”, se este for o seu caso, não hesite em implementar o cache distribuído. Se a sua equipe estiver mais familiarizada com o SQL Server, mesmo que a sua performance seja inferior ao Redis, esta é uma boa escolha. Se este não for o caso, procure sempre optar por uma solução “em-memória”, como o Redis e o NCache.

- [ #C# ](https://www.treinaweb.com.br/blog/tag/csharp)
- [ #ASP.NET ](https://www.treinaweb.com.br/blog/tag/asp-net)
- [ #SQL Server ](https://www.treinaweb.com.br/blog/tag/sql-server)
- [ #ASP .NET Core ](https://www.treinaweb.com.br/blog/tag/asp-net-core)
- [ #Redis ](https://www.treinaweb.com.br/blog/tag/redis)
- [ #Cache ](https://www.treinaweb.com.br/blog/tag/cache)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/09/cache-memória-asp-net-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Implementando cache de memória no ASP.NET Core ](https://www.treinaweb.com.br/blog/implementando-cache-de-memoria-no-asp-net-core) 

     A performance de um site pode ser um favor determinante para o seu sucesso ou fracasso, veja como melhorar isso no ASP.NET Core com cache de memória.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/04/05114857/ORLEANS-400x280.png)  [ Infraestrutura e Sistemas Operacionais ](https://www.treinaweb.com.br/blog/categoria/infraestrutura-e-sistemas-operacionais) 

     9 anos atrás

    ##  [ Conhecendo o Microsoft Orleans ](https://www.treinaweb.com.br/blog/conhecendo-o-microsoft-orleans) 

     Conheça o framework Microsoft Orleans e veja como ele tenta resolver o "problema" dos sistemas distribuídos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/capa-DDoS-400x280.png)  [ Segurança da Informação ](https://www.treinaweb.com.br/blog/categoria/seguranca-da-informacao) 

     7 anos atrás

    ##  [ Termos comuns de segurança: DDoS ](https://www.treinaweb.com.br/blog/termos-comuns-de-seguranca-ddos) 

     Continuando com nossa série de artigos sobre os termos comuns de segurança, vamos abordar hoje o DDoS – sigla para Distributed Denial of Service.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/03/29132239/PROTOCOLO-TUS-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Implementando o protocolo tus em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/implementando-o-protocolo-tus-em-uma-aplicacao-asp-net-core) 

     Realizar o upload de grandes arquivos pode ser uma dor de cabeça, mas o protocolo tus foi criado para facilitar este processo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/hybrid-orm-repodb-no-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Utilizando o hybrid ORM RepoDb em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-hybrid-orm-repodb-em-uma-aplicacao-asp-net-core) 

     Um meio termo entre o Dapper e o Entity Framework, o hybrid ORM RepoDb é uma ótima opção de ORM para aplicações intermediárias.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/16095041/OCELOT-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Criando um API Gateway com ASP.NET Core e Ocelot ](https://www.treinaweb.com.br/blog/criando-um-api-gateway-com-asp-net-core-e-ocelot) 

     Conheça o conceito de API Gateway e veja como criá-lo em uma aplicação ASP.NET utilizando a biblioteca Ocelot.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/05142558/mediator-pattern-com-mediatr-no-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     7 anos atrás

    ##  [ Mediator Pattern com MediatR no ASP.NET Core ](https://www.treinaweb.com.br/blog/mediator-pattern-com-mediatr-no-asp-net-core) 

     Manter os objetos isolados é o objetivo do Mediator Pattern. No ASP.NET Core a sua implementação é facilitada com a biblioteca MediatR.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/06/novidades-do-android-o-para-desenvolvedores-400x280.png)  [ Android ](https://www.treinaweb.com.br/blog/categoria/android) 

     10 anos atrás

    ##  [ Novidades do Android O para desenvolvedores ](https://www.treinaweb.com.br/blog/novidades-do-android-o-para-desenvolvedores) 

     O Google está a todo vapor para lançar o Android O. Porém, antes mesmo do lançamento oficial, já é possível conferir as novidades.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/nhibernate-no-asp-net-core-400x280.png)  [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) 

     7 anos atrás

    ##  [ Utilizando o NHibernate em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-nhibernate-em-uma-aplicacao-asp-net-core) 

     O NHibernate é uma biblioteca madura e muito utilizada que agora fornece suporte para o .NET Core. Veja um exemplo do NHibernate no ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/spring-framework-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ O que é Spring Framework? ](https://www.treinaweb.com.br/blog/o-que-e-spring-framework) 

     Confira neste artigo o Spring framework: um ecossistema de desenvolvimento para facilitar a criação de aplicações Java.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/09/o_que_e_o_django_rest_framework-400x280.png)  [ Django ](https://www.treinaweb.com.br/blog/categoria/django) 

     6 anos atrás

    ##  [ O que é o Django REST Framework? ](https://www.treinaweb.com.br/blog/o-que-e-o-django-rest-framework) 

     Veja neste artigo o que é o Django REST Framework.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/18095832/capa-elton-symfony-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Symfony Componentes: o que são e qual sua importância para o ecossistema PHP ](https://www.treinaweb.com.br/blog/symfony-componentes-o-que-sao-e-qual-sua-importancia-para-o-ecossistema-php) 

     Entenda o que são os componentes do Symfony, o que eles fazem, quais as vantagens e desvantagens de utilizá-los. Além disso falaremos da importância deles para o ecossistema PHP.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **13h 34min 31s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
