Para ajudar os desenvolvedores de .NET a usar melhor o Couchbase em seus aplicativos, há uma coleção de aplicativos compatíveis com a comunidade Extensões do Couchbase. Isso inclui extensões para cache, sessão, multiop, compactação e bloqueio. E há algumas extensões oficialmente suportadas para injeção de dependência, telemetria aberta e transações.
A principal extensão a ser discutida hoje é Couchbase.Extensions.Cachingque implementa o Interface do cache distribuído do .NET usando o Couchbase. Isso pode ser adicionado ao seu projeto com NuGet (dotnet add package Couchbase.Extensions.Caching).
Recentemente, trabalhei com um cliente do setor de cruzeiros que está gerenciando vários aplicativos e deseja armazenar dados de cache separadamente para cada aplicativo. No entanto, criar um bucket totalmente novo para cada aplicativo é um exagero. Eles estavam se perguntando como especificar um escopo/coleção ao usar o Couchbase.Extensions.Caching biblioteca.
Extensões de sessão e de cache
Nos últimos anos, a mudança do Couchbase SDK 2 para o SDK 3 introduziu muitos novos recursos e aprimoramentos, incluindo Suporte a escopos/coleções. O Couchbase.Extensions A família também foi atualizada para oferecer suporte ao SDK 3.
No entanto, o padrão O uso dessa biblioteca usa o Padrão escopo e Padrão sem nenhuma opção integrada para especificar qualquer outra coisa.
Para ver isso em ação, aqui está a linha de configuração para adicionar o Couchbase como um cache distribuído (extraído do arquivo Projeto de exemplo do GitHub):
1 |
construtor.Serviços.AddDistributedCouchbaseCache("myproject", optar => { }); |
Nesse código, meu projeto é um nome de bucket. O optar não tem uma opção para o nome do escopo/coleção.
Usando o projeto de amostra, você terá informações em cache como estas:
(Observe que os nomes do bucket, do escopo e da coleção são meu projeto, Padrãoe Padrão).
Extensão da extensão
Felizmente, a biblioteca é extensível o suficiente para que, com um pouco de código, ela possa ser apontada para qualquer coleção que você queira.
Vamos examinar um pouco mais a fundo o projeto, especificamente ICouchbaseCacheCollectionProvider.cs e DefaultCouchbaseCacheCollectionProvider.cs
-
- ICouchbaseCacheCollectionProvider contém um método, GetCollectionAsync.
- A função implementa esse método com: return bucket.DefaultCollection();
Mas e se você não quiser usar a coleção padrão?
Nesse caso, crie uma implementação personalizada de ICouchbaseCacheCollectionProvider. Vou ligar para o meu Provedor CustomCouchbaseCacheCollection:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
usando Couchbase.KeyValue; espaço de nome Couchbase.Extensões.Armazenamento em cache.Exemplo.Armazenamento em cache; público classe Provedor CustomCouchbaseCacheCollection : ICouchbaseCacheCollectionProvider { privado somente leitura ICouchbaseCacheBucketProvider _bucketProvider; privado somente leitura string _scopeName; privado somente leitura string _collectionName; público Provedor CustomCouchbaseCacheCollection(ICouchbaseCacheBucketProvider provedor de balde, string scopeName, string collectionName) { _bucketProvider = provedor de balde; _scopeName = scopeName; _collectionName = collectionName; } público assíncrono ValueTask<ICouchbaseCollection> GetCollectionAsync() { var balde = aguardar _bucketProvider.GetBucketAsync().ConfigureAwait(falso); var escopo = aguardar balde.ScopeAsync(_scopeName); retorno aguardar escopo.CollectionAsync(_collectionName); } } |
Considere isso como um ponto de partida. Em sua implementação, você pode configurá-lo como quiser, adicionar lógica adicional, etc.
A próxima etapa é adicionar isso como um serviço (em Program.cs normalmente), especificando os nomes de escopo/coleção:
1 2 3 4 5 |
construtor.Serviços.AddSingleton<ICouchbaseCacheCollectionProvider>(x => novo Provedor CustomCouchbaseCacheCollection( x.GetRequiredService<ICouchbaseCacheBucketProvider>(), "mycachingscope", "mycachingcollection" (coleção de cache))); |
Se você estiver preocupado com o fato de isso ser substituído pelo provedor padrão, observe que TryAddSingleton é usado dentro de AddDistributedCouchbaseCache. Isso significa que não vai substitua seu provedor personalizado pelo provedor padrão.
Provedor personalizado em ação
Essa extensão não criará de fato o escopo e a coleção especificados, portanto, certifique-se de que você os tenha criado com antecedência.
Execute o aplicativo e experimente a API de previsão do tempo com a página interativa OpenAPI. A primeira vez que executar o ponto de extremidade resultará em uma "falha de cache", e nesse ponto os dados da previsão do tempo serão gravados na coleção especificada:
(Observe que os nomes do bucket, do escopo e da coleção são meu projeto, mycachingscopee mycachingcollection).
Resumo
Com uma implementação personalizada de uma interface e uma linha extra no Program.csSe você quiser armazenar dados em cache, poderá especificar o escopo/coleção em que deseja armazená-los.
Além disso, o Couchbase.Extensions.Session usa a extensão de cache como o mecanismo de armazenamento subjacente.
-
- Feliz cache! O código-fonte está disponível no GitHub.
- Para obter mais informações sobre o .NET, consulte o Fórum do Couchbase .NET e Documentação do SDK do .NET.
- Se você tiver dúvidas sobre cache, sessão ou arquitetura em geral, consulte a seção Discórdia do Couchbase.