As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Use o armazenamento em cache para reduzir a demanda do banco de dados
Visão geral
Você pode usar o armazenamento em cache como uma estratégia eficaz para ajudar a reduzir os custos do seu. NETaplicações. Muitos aplicativos usam bancos de dados de back-end, como o SQL Server, quando os aplicativos exigem acesso frequente aos dados. O custo de manter esses serviços de back-end para lidar com a demanda pode ser alto, mas você pode usar uma estratégia eficaz de armazenamento em cache para reduzir a carga nos bancos de dados de back-end, reduzindo os requisitos de dimensionamento e escalabilidade. Isso pode ajudá-lo a reduzir custos e melhorar o desempenho de seus aplicativos.
O armazenamento em cache é uma técnica útil para economizar nos custos relacionados à leitura de cargas de trabalho pesadas que usam recursos mais caros, como SQL o Server. É importante usar a técnica certa para sua carga de trabalho. Por exemplo, o armazenamento em cache local não é escalável e exige que você mantenha um cache local para cada instância de um aplicativo. Você deve avaliar o impacto no desempenho em comparação com os custos potenciais, para que o menor custo da fonte de dados subjacente compense quaisquer custos adicionais relacionados ao mecanismo de armazenamento em cache.
Impacto nos custos
SQLO servidor exige que você leve em consideração as solicitações de leitura ao dimensionar seu banco de dados. Isso pode afetar os custos, pois talvez seja necessário introduzir réplicas de leitura para acomodar a carga. Se você estiver usando réplicas de leitura, é importante entender que elas só estão disponíveis na edição SQL Server Enterprise. Essa edição exige uma licença mais cara do que a edição SQL Server Standard.
O diagrama a seguir foi projetado para ajudar você a entender a eficácia do armazenamento em cache. Ele mostra o Amazon RDS for SQL Server com quatro nós db.m4.2xlarge executando a edição Server Enterprise. SQL Ele é implantado em uma configuração Multi-AZ com uma réplica de leitura. O tráfego de leitura exclusivo (por exemplo, SELECT consultas) é direcionado às réplicas de leitura. Em comparação, o Amazon DynamoDB usa um cluster r4.2xlarge de dois nós do DynamoDB Accelerator (). DAX
O gráfico a seguir mostra os resultados da eliminação da necessidade de réplicas de leitura dedicadas que lidem com alto tráfego de leitura.
Você pode obter economias de custo significativas usando o cache local sem réplicas de leitura ou introduzindo DAX lado a lado o SQL Server on Amazon RDS como uma camada de cache. Essa camada é descarregada do SQL Servidor e reduz o tamanho do SQL Servidor necessário para executar o banco de dados.
Recomendações de otimização de custos
Armazenamento em cache local
O armazenamento em cache local é uma das formas mais usadas de armazenar conteúdo em cache para aplicativos hospedados em ambientes locais ou na nuvem. Isso ocorre porque é relativamente fácil e intuitivo de implementar. O armazenamento em cache local envolve pegar conteúdo de um banco de dados ou de outra fonte e armazenar em cache localmente na memória ou no disco para acesso mais rápido. Essa abordagem, embora fácil de implementar, não é ideal para alguns casos de uso. Por exemplo, isso inclui casos de uso em que o conteúdo em cache precisa persistir ao longo do tempo, como preservar o estado do aplicativo ou do usuário. Outro caso de uso é quando o conteúdo em cache precisa ser acessado de outras instâncias do aplicativo.
O diagrama abaixo ilustra um cluster de SQL servidores altamente disponível com quatro nós e duas réplicas de leitura.
Com o armazenamento em cache local, talvez seja necessário balancear a carga do tráfego em várias EC2 instâncias. Cada instância deve manter seu próprio cache local. Se o cache armazenar informações com estado, é necessário que haja confirmações regulares no banco de dados, e os usuários talvez precisem ser encaminhados para a mesma instância em cada solicitação subsequente (sessão fixa). Isso representa um desafio ao tentar escalar aplicativos, pois algumas instâncias podem ser superutilizadas, enquanto outras são subutilizadas devido à distribuição desigual do tráfego.
Você pode usar o cache local, na memória ou usando armazenamento local, para. NETaplicações. Para fazer isso, você pode adicionar funcionalidade para armazenar objetos em disco e recuperá-los quando necessário, ou consultar dados do banco de dados e mantê-los na memória. Para realizar o armazenamento em cache local na memória e no armazenamento local de dados de um SQL servidor em C#, por exemplo, você pode usar uma combinação de MemoryCache
bibliotecas e. LiteDB
MemoryCache
fornece armazenamento em cache na memória, enquanto LiteDB
é um banco de dados incorporado, sem SQL base em disco, que é rápido e leve.
Para realizar o armazenamento em cache na memória, use o. NETBibliotecaSystem.Runtime.MemoryCache
. O exemplo de código a seguir mostra como usar a System.Runtime.Caching.MemoryCache
classe para armazenar dados em cache na memória. Essa classe fornece uma forma de armazenar dados temporariamente na memória do aplicativo. Isso pode ajudar a melhorar o desempenho de um aplicativo, reduzindo a necessidade de buscar dados de um recurso mais caro, como um banco de dados ou umAPI.
Veja como o código funciona:
-
Uma instância estática privada de
MemoryCache
named_memoryCache
é criada. O cache recebe um nome (dataCache
) para identificá-lo. Em seguida, o cache armazena e recupera os dados. -
O
GetData
método é um método genérico que usa dois argumentos: umastring
chave e umFunc<T>
delegado chamadogetData
. A chave é usada para identificar os dados em cache, enquanto ogetData
delegado representa a lógica de recuperação de dados que é executada quando os dados não estão presentes no cache. -
O método primeiro verifica se os dados estão presentes no cache usando o
_memoryCache.Contains(key)
método. Se os dados estiverem no cache, o método recuperará os dados usando_memoryCache.Get(key)
e os converterá no tipo esperado T. -
Se os dados não estiverem no cache, o método chama o
getData
delegado para buscá-los. Em seguida, ele adiciona os dados ao cache usando_memoryCache.Add(key, data, DateTimeOffset.Now.AddMinutes(10))
. Essa chamada especifica que a entrada do cache deve expirar após 10 minutos, momento em que os dados são removidos do cache automaticamente. -
O
ClearCache
método usa umastring
chave como argumento e remove os dados associados a essa chave do cache usando_memoryCache.Remove(key)
.
using System; using System.Runtime.Caching; public class InMemoryCache { private static MemoryCache _memoryCache = new MemoryCache("dataCache"); public static T GetData<T>(string key, Func<T> getData) { if (_memoryCache.Contains(key)) { return (T)_memoryCache.Get(key); } T data = getData(); _memoryCache.Add(key, data, DateTimeOffset.Now.AddMinutes(10)); return data; } public static void ClearCache(string key) { _memoryCache.Remove(key); } }
Você pode usar o seguinte código:
public class Program { public static void Main() { string cacheKey = "sample_data"; Func<string> getSampleData = () => { // Replace this with your data retrieval logic return "Sample data"; }; string data = InMemoryCache.GetData(cacheKey, getSampleData); Console.WriteLine("Data: " + data); } }
O exemplo a seguir mostra como usar o LiteDBLocalStorageCache
classe contém as principais funções para gerenciar o cache.
using System; using LiteDB; public class LocalStorageCache { private static string _liteDbPath = @"Filename=LocalCache.db"; public static T GetData<T>(string key, Func<T> getData) { using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection<T>("cache"); var item = collection.FindOne(Query.EQ("_id", key)); if (item != null) { return item; } } T data = getData(); using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection<T>("cache"); collection.Upsert(new BsonValue(key), data); } return data; } public static void ClearCache(string key) { using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection("cache"); collection.Delete(key); } } } public class Program { public static void Main() { string cacheKey = "sample_data"; Func<string> getSampleData = () => { // Replace this with your data retrieval logic return "Sample data"; }; string data = LocalStorageCache.GetData(cacheKey, getSampleData); Console.WriteLine("Data: " + data); } }
Se você tiver um cache estático ou arquivos estáticos que não mudam com frequência, você também pode armazenar esses arquivos no armazenamento de objetos do Amazon Simple Storage Service (Amazon S3). O aplicativo pode recuperar o arquivo de cache estático na inicialização para usar localmente. Para obter mais detalhes sobre como recuperar arquivos do Amazon S3 usando o. NET, consulte Download de objetos na documentação do Amazon S3.
Armazenamento em cache com DAX
Você pode usar uma camada de cache que pode ser compartilhada entre todas as instâncias do aplicativo. O DynamoDB Accelerator DAX () é um cache de memória totalmente gerenciado e altamente disponível para o DynamoDB que pode oferecer uma melhoria de desempenho dez vezes maior. Você pode usar DAX para reduzir custos reduzindo a necessidade de provisionar em excesso as unidades de capacidade de leitura nas tabelas do DynamoDB. Isso é especialmente útil para cargas de trabalho com muita leitura e que exigem leituras repetidas para chaves individuais.
O preço do DynamoDB é feito sob demanda ou com capacidade provisionada, portanto, o número de leituras e gravações por mês contribui para o custo. Se você leu cargas de trabalho pesadas, os DAX clusters podem ajudar a reduzir os custos ao reduzir o número de leituras nas tabelas do DynamoDB. Para obter instruções sobre como configurarDAX, consulte Aceleração na memória com o DynamoDB Accelerator (DAX) na documentação do DynamoDB. Para obter informações sobre. NETintegração de aplicativos, assista Integrating DAX Amazon ASP DynamoDB into Your. NET
Recursos adicionais
-
Aceleração na memória com o DynamoDB Accelerator () DAX - Amazon DynamoDB (documentação do DynamoDB)
-
Integrando o DAX Amazon ASP DynamoDB ao seu. NET
Aplicativo (YouTube) -
Baixando objetos (documentação do Amazon S3)