O armazenamento em cache distribuído pode ajudar a melhorar o desempenho de um aplicativo ASP.NET Core. Isso é especialmente verdadeiro para um aplicativo ASP.NET que é implantado em um farm de servidores ou em um ambiente de nuvem escalável. Usar o Couchbase Server para armazenamento em cache é um dos muitos recursos que o tornam a escolha ideal para seu aplicativo ASP.NET Core. necessidades do banco de dados de engajamento.
Nesta postagem do blog, mostrarei a você como usar o Plug-in do middleware Couchbase.Extensions.Caching para adicionar facilmente recursos de cache distribuído ao seu aplicativo.
Você pode acompanhar o código de amostra que escrevi para esta postagem no GitHub.
Observe que o Couchbase.Extensions.Caching está atualmente em uma versão beta2 (no momento em que escrevo esta postagem do blog), portanto, algumas coisas podem mudar.
Configuração básica do Couchbase
Primeiro, você precisará de um cluster do Couchbase Server em execução (você pode instalá-lo no localou com o Dockerou mesmo no Azure se você quiser).
Em seguida, você precisará criar um balde no Couchbase onde os dados armazenados em cache serão armazenados. Chamei o meu de "cachebucket". Talvez você queira aproveitar as vantagens do novo recurso de balde efêmero no Couchbase Server 5.0 para armazenamento em cache, mas não é necessário.
Se você estiver usando o Couchbase Server 5.0, também precisará criar um usuário com permissões (Data Writer e Data Reader) nesse bucket. Para manter as coisas simples, crie um usuário com o mesmo nome do bucket (por exemplo, "cachebucket").
Cache distribuído com o Couchbase.Extensions
O Couchbase.Extensions (GitHub) tem como objetivo tornar mais simples o trabalho com o Couchbase Server e o .NET Core. O armazenamento em cache é apenas uma dessas extensões.
Você pode adicioná-lo ao seu projeto ASP.NET Core com o NuGet, por meio do Package Manager: Instalar o pacote Couchbase.Extensions.Caching -Versão 1.0.0-beta2ou com a interface do usuário do NuGet, ou você pode usar a linha de comando do .NET: dotnet add pacote Couchbase.Extensions.Caching --versão 1.0.0-beta2.

Depois de adicionar isso ao seu projeto, você precisará fazer algumas pequenas alterações em seu Inicialização classe em Startup.cs.
Primeiro, em ConfigureServicesAdicione alguns namespaces:
|
1 2 |
usando Couchbase.Extensões.Armazenamento em cache; usando Couchbase.Extensões.Injeção de dependência; |
Isso tornará o namespace Caching disponível e, especificamente, o namespace AddDistributedCouchbaseCache método de extensão para IServiceCollection. Em seguida, chame esse método de extensão de dentro do ConfigureServices método.
O outro espaço de nome lá dentro, Injeção de dependênciaé necessário para injetar a funcionalidade do Couchbase. Nesse caso, ela será usada somente pela extensão Caching. Mas você também pode usá-la para outras finalidades, que abordarei em uma postagem futura no blog.
Mas, por enquanto, ele só é necessário para o AddCouchbase método de extensão em IServiceCollection.
Por fim, junte os dois, e seu ConfigureServices deve ter a seguinte aparência:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
público vazio ConfigureServices(IServiceCollection serviços) { serviços.AddMvc(); serviços.AddCouchbase(optar => { optar.Servidores = novo Lista<Uri> { novo Uri("http://localhost:8091") }; }); serviços.AddDistributedCouchbaseCache("cachebucket", "senha", optar => { }); } |
Uso de cache distribuído
Agora que você tem uma configuração de cache distribuído com o Couchbase em seu projeto ASP.NET Core, pode usar IDistributedCache em outra parte do seu projeto.
Injeção de IDistributedCache
Um exemplo simples seria usá-lo diretamente em um controlador. Ele pode ser injetado em construtores conforme sua necessidade:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
público classe HomeController : Controlador { privado somente leitura IDistributedCache _cache; público HomeController(IDistributedCache cache) { _cache = cache; } // ... snip ... } |
Cache de strings
Você pode usar o GetString e SetString para recuperar/definir um valor de string no cache.
|
1 2 3 4 5 6 7 8 9 |
// cache/recuperação do cache // uma string, armazenada na chave "CachedString1" var mensagem = _cache.GetString("CachedString1"); se (mensagem == nulo) { mensagem = DateTime.Agora + " " + Caminho.GetRandomFileName(); _cache.SetString("CachedString1", mensagem); } Exibir dados["Mensagem"] = "'CachedString1' é '" + mensagem + "'"; |
Isso apareceria no bucket "cachebucket" como um valor binário codificado (não JSON).

No código de exemplo, eu simplesmente imprimo o ViewData["Message"] na visualização do Razor. A aparência deve ser semelhante a esta:

Objetos em cache
Você também pode usar Set e Obter para salvar e recuperar objetos no cache. Criei um POCO (Plain Old CLR Object) muito simples para demonstrar:
|
1 2 3 4 5 6 |
público classe MyPoco { público string Nome { obter; definir; } público int Tamanho do calçado { obter; definir; } público decimal Preço { obter; definir; } } |
Em seguida, na amostra, eu gero uma string aleatória para usar como uma chave de cache e uma instância gerada aleatoriamente de MyPoco. Primeiro, eu os armazeno no cache usando o Set método:
|
1 2 3 |
var pocoKey = Caminho.GetRandomFileName(); _cache.Conjunto(pocoKey, MyPoco.Gerar(), nulo); Exibir dados["Message2"] = "Colocou em cache um POCO em '" + pocoKey + "'"; |
Em seguida, imprimo a chave para a visualização do Razor:

Em seguida, posso usar essa chave para procurar o valor no Couchbase:

Além disso, observe que ele foi serializado para JSON. Isso não significa apenas que você pode lê-lo, mas também pode consultá-lo com o N1QL (se necessário).
Cache distribuído com expiração
Se quiser que os valores no cache expirem após um determinado período de tempo, você pode especificar isso com DistributedCacheEntryOptions (somente SlidingExpiration é suportado no momento).
|
1 2 3 4 5 6 |
var outraPocoKey = Caminho.GetRandomFileName(); _cache.Conjunto(outraPocoKey, MyPoco.Gerar(), novo DistributedCacheEntryOptions { SlidingExpiration = novo Tempo(0, 0, 10) // 10 segundos }); Exibir dados["Message3"] = "Colocou em cache um POCO em '" + outraPocoKey + "'"; |
No projeto de amostra, também configurei isso para ser impresso no Razor.

Se você visualizar esse documento (antes que os 10 segundos se esgotem) no Console do Couchbase, verá que ele tem um expiração em seus metadados. Veja um exemplo:
|
1 2 3 4 5 6 |
{ "id": "xjkmswko.v35", "rev": "1-14e1d9998125000059b0404502000001", "expiração": 1504723013, "flags" (sinalizadores): 33554433 } |
Após 10 segundos, esse documento desaparecerá do compartimento e você verá um erro "not found (Document does not exist)" (não encontrado (o documento não existe)).
Eliminação do cache distribuído
Por fim, não se esqueça de limpar os recursos usados pelo Couchbase .NET SDK para o armazenamento em cache distribuído. Uma maneira fácil de fazer isso é com o comando ApplicationStopped evento. Você pode conectar isso em Inicialização:
|
1 2 3 4 |
appLifetime.ApplicationStopped.Registro(() => { aplicativo.ApplicationServices.GetRequiredService<ICouchbaseLifetimeService>().Fechar(); }); |
Observe que você terá que adicionar IApplicationLifetime appLifetime como um parâmetro para o Configurar método em Inicialização se você ainda não o fez.
Resumo
Usar o Couchbase Server para armazenamento em cache distribuído em seu aplicativo ASP.NET Core é uma ótima maneira de melhorar o desempenho e a escalabilidade do seu aplicativo. Esse tipo de caso de uso de "engajamento" é o que o Couchbase Server faz de melhor. Para ver os clientes que estão usando o Couchbase Server para armazenamento em cache, confira a página Clientes do Couchbase página.
Se você tiver perguntas ou comentários sobre o projeto Couchbase.Extensions.Caching, não deixe de conferir a seção Repositório do GitHub ou o Fóruns do SDK do Couchbase .NET.
Como sempre, você pode entrar em contato comigo deixando um comentário abaixo ou encontrando-me em Twitter @mgroves.
Mathew,
Este foi um bom artigo sobre como começar a usar o couchebase. Tentei fazer o download do servidor couchebase localmente para estudar e consegui implementar o cache em um aplicativo dotnet core usando o middleware fornecido. O único problema que tenho no momento é com a versão mais antiga do couchebase em meu local de trabalho. Acontece que eles têm um servidor couchebase antigo que não tem segurança protegida por senha no nível do bucket e, quando estou tentando
services.AddCouchbase(opt =>
{
opt.Servers = new List
{
novo Uri("http://myworkplacecouchebasehostname:8091")
};
});
//não há senha para o bucket, então se
services.AddDistributedCouchbaseCache("bucketname", opt => {});
Recebo o seguinte erro com o stacktrace. Você pode me indicar a direção correta do que estou perdendo aqui?
Ocorreu uma exceção não tratada durante o processamento da solicitação.
BootstrapException: Não foi possível fazer o bootstrap - verifique as exceções internas para obter detalhes. (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) (Não foi possível fazer o bootstrap com CCCP. (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond)) (Após o bootstrapping, a lista de nós tem zero elementos, indicando que o cliente falhou durante o bootstrapping. Verifique os registros do cliente para obter mais informações sobre o motivo da falha).
Couchbase.Core.ClusterController.CreateBucketImpl(string bucketName, string password, IAuthenticator authenticator)
SocketException: Uma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente após um período de tempo, ou a conexão estabelecida falhou porque o host conectado não respondeu
Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)
CouchbaseBootstrapException: Após o bootstrapping, a lista de nós tem zero elementos, indicando que o cliente falhou durante o bootstrapping. Verifique os logs do cliente para obter mais informações sobre o motivo da falha.
Couchbase.Configuration.CouchbaseConfigContext.UpdateServices(Dictionary servers)
SocketException: Uma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente após um período de tempo, ou a conexão estabelecida falhou porque o host conectado não respondeu
Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)
Oi zysed,
Recomendo que você publique essa pergunta nos fóruns do .NET: https://forums.couchbase.com/c/net-sdk ou possivelmente como um problema na biblioteca de extensões: https://github.com/couchbaselabs/Couchbase.Extensions
Provavelmente há uma solução alternativa, e postar nesses lugares fará com que mais pessoas vejam o problema do que apenas eu.
Recomendo enfaticamente que você coloque uma senha em seu bucket ou atualize para uma versão mais recente do Couchbase Server (onde não é mais possível ter um bucket sem senha). Mesmo que seu servidor esteja protegido por um firewall, ainda é perigoso deixá-lo completamente desprotegido. Além disso, uma versão tão antiga do Couchbase provavelmente deixará de receber versões de correção de bugs (se é que já não recebeu).
Obrigado, Matthew. Também concordo plenamente. Mais uma vez, continue escrevendo bons artigos como este, pois eles são muito úteis.