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á.
Amazon ElastiCache (Valkey) para aplicativos de comércio eletrônico
Um aplicativo de comércio eletrônico se beneficia de uma camada de cache na memória entre os servidores de aplicativos e o banco de dados. A Amazon que ElastiCache executa o Valkey fornece latência de leitura de menos de um milissegundo para dados acessados com frequência — entradas no catálogo de produtos, contagens de inventário, resultados de pesquisa e sessões de usuários — reduzindo a carga do banco de dados e melhorando os tempos de resposta durante picos de tráfego.
Configuração do cluster
Escolha um tipo de cluster com base em seu volume de dados, requisitos de taxa de transferência e preferências operacionais.
| Tipo de cluster | Melhor para | Escalabilidade | Considerações |
|---|---|---|---|
Sem servidor |
Padrões de tráfego variáveis, novos aplicativos, equipes sem experiência em operações de cache |
Automático — dimensiona a computação e a memória com base na demanda |
Não é necessário planejar a capacidade. Modelo de custo variável — você paga pelo que consome. |
Node-based (modo de cluster ativado) |
Cargas de trabalho previsíveis de alto rendimento, necessidade de controle refinado sobre fragmentação e tipos de nós |
Dimensionamento manual ou automático de fragmentos e réplicas |
Requer planejamento de capacidade. Modelo de custo fixo — você paga pela capacidade provisionada, independentemente da utilização. Suporta até 500 nós por cluster. |
Para a maioria dos aplicativos de comércio eletrônico iniciantes, o Serverless fornece o caminho mais simples para a produção. Migre para clusters baseados em nós quando tiver linhas de base de tráfego previsíveis e precisar de mais controle sobre a topologia do cluster, os tipos de nós e o comportamento de escalabilidade.
| Configuração | Valor | Lógica |
|---|---|---|
Mecanismo |
Última versão estável |
Use a última versão estável do Valkey disponível em ElastiCache. Totalmente compatível com os comandos do Redis OSS. Oferece melhorias de desempenho em relação às versões anteriores. |
Multi-AZ |
Habilitado |
Failover automático para uma réplica em outra zona de disponibilidade se o nó primário falhar. Necessário para cargas de trabalho de comércio eletrônico de produção. |
In-transit criptografia |
Ativado (TLS) |
Criptografa dados entre seu aplicativo e o cluster de cache. Necessário para cargas de trabalho que lidam com sessões de usuários ou qualquer PII. |
At-rest criptografia |
Habilitado |
Criptografa dados em disco (backups, troca). Necessário para cargas de trabalho de conformidade. |
Grupo de sub-redes |
Sub-redes privadas isoladas (mais de 2 AZs) |
Sem acesso à internet. Acessível somente pelo grupo de segurança do seu aplicativo. |
Design chave para dados do produto
Crie chaves de cache para serem previsíveis, depuráveis e com escopo definido para evitar colisões entre os tipos de dados.
| Tipo de dados | Padrão chave | Tipo de valor | Exemplo |
|---|---|---|---|
Detalhes do produto |
|
Hash |
|
Contagem de inventário |
|
Cadeia de caracteres (inteiro) |
|
Sessão de usuário |
|
Hash |
|
Resultados da pesquisa |
|
Cadeia de caracteres (JSON) |
|
Listagem de categorias |
|
Lista |
|
Principais práticas recomendadas de design:
Use dois pontos como separadores para facilitar a leitura e o suporte de ferramentas.
Mantenha as teclas curtas — as teclas longas consomem memória e largura de banda da rede.
Inclua o prefixo do tipo de dados para evitar colisões entre produtos, sessões e outras entidades que possam compartilhar IDs numéricas.
Use hashes para objetos de vários campos (produtos, sessões) para permitir leituras e atualizações parciais sem recuperar o valor inteiro.
Estratégia TTL por tipo de dados
Defina valores de TTL (tempo de vida útil) com base na frequência com que os dados mudam e em quão obsoletos eles podem ficar sem afetar a experiência do cliente.
| Tipo de dados | TTL | Gatilho de invalidação | Lógica |
|---|---|---|---|
Detalhes do produto |
5 minutos |
O vendedor edita o produto |
As descrições e imagens dos produtos mudam com pouca frequência. Curto o suficiente para realizar edições com rapidez razoável, sem invalidação explícita de cada alteração. |
Contagem de inventário |
30 segundos |
Comprar ou reabastecer |
O estoque obsoleto pode causar vendas excessivas. Um TTL muito curto garante que as contagens sejam atualizadas com frequência. Invalidação explícita na compra para precisão imediata. |
Resultados da pesquisa |
60 segundos |
Nenhum (TTL-based somente) |
Os índices de pesquisa são atualizados periodicamente. O armazenamento em cache reduz a carga do mecanismo de pesquisa. Novos produtos aparecem em 60 segundos sem invalidação explícita. |
Sessão de usuário |
24 horas |
Sessão ou expiração da sessão |
As sessões persistem durante a navegação. Atualize o TTL em cada acesso para manter as sessões ativas ativas. Exclua explicitamente ao sair. |
Listagem de categorias |
2 minutos |
Produto added/removed da categoria |
As páginas de categorias têm alto tráfego. O breve armazenamento em cache reduz substancialmente as consultas ao banco de dados durante a navegação. |
Cache-aside padrão
O padrão cache-aside (também chamado de carregamento lento) é a estratégia de armazenamento em cache mais comum para aplicativos de comércio eletrônico. Seu aplicativo verifica o cache primeiro e só consulta o banco de dados em caso de falha de cache.
Caminho de leitura (pseudocódigo)
FUNCTION getProduct(productId): cacheKey = "product:" + productId // Step 1: Check the cache cachedValue = cache.GET(cacheKey) IF cachedValue exists: RETURN deserialize(cachedValue) // Cache hit — sub-millisecond // Step 2: Cache miss — query database product = database.query("SELECT * FROM products WHERE id = ?", productId) IF product not found: RETURN null // Step 3: Write to cache with TTL cache.SET(cacheKey, serialize(product), EXPIRE = 300) // 5 minutes RETURN product
Caminho de gravação (pseudocódigo)
FUNCTION updateProduct(productId, updatedFields): // Step 1: Update the database (source of truth) database.update("UPDATE products SET ... WHERE id = ?", updatedFields, productId) // Step 2: Invalidate the cache (don't update it) cache.DELETE("product:" + productId) // Next read will trigger a cache miss and repopulate from database
Importante
Sempre invalide (exclua) em vez de atualizar o cache nas gravações. Isso reduz a janela para condições de corrida em que uma leitura obsoleta substitui um valor mais novo. A próxima leitura preenche novamente o cache do banco de dados, que é a fonte da verdade. Observe que ainda existe uma condição de disputa restrita: se uma leitura simultânea buscar dados do banco de dados antes que a gravação ocorra, ela poderá repreencher o cache com dados obsoletos depois que a chave de cache já tiver sido excluída. Para a maioria das cargas de trabalho de comércio eletrônico, o TTL curto torna isso aceitável. Se você precisar de consistência estrita, use um bloqueio distribuído ou gravações com controle de versão.
Lidando com falhas de cache
FUNCTION getProductWithFallback(productId): TRY: RETURN getProduct(productId) // Normal cache-aside path CATCH cacheConnectionError: // Cache is unavailable — fall back to database directly RETURN database.query("SELECT * FROM products WHERE id = ?", productId) // Log the error, trigger an alarm, but don't fail the request
Projete seu aplicativo de forma que a falha no cache prejudique o desempenho (respostas mais lentas), mas não prejudique a funcionalidade. O banco de dados serve como substituto.
Estratégias de invalidação de cache
A invalidação garante que os usuários vejam os dados atuais após as atualizações. Escolha uma estratégia com base na rapidez com que as mudanças devem estar visíveis.
| Abordagem | Como funciona | Quando usar |
|---|---|---|
Excluir ao escrever |
O aplicativo exclui a chave de cache imediatamente após atualizar o banco de dados. |
A maioria das gravações (edições de produtos, alterações no inventário). Simples, confiável, evita dados obsoletos. |
Somente expiração de TTL |
Não invalide — deixe o TTL expirar naturalmente. |
Dados em que uma breve obsolescência é aceitável (resultados de pesquisa, listagens de categorias, análises). |
Event-driven invalidação |
Um processo em segundo plano escuta os eventos de alteração do banco de dados e invalida as chaves afetadas. |
Sistemas em que o caminho de gravação e o cache estão em serviços diferentes ou quando uma única alteração no banco de dados afeta muitas chaves de cache. |
Para aplicativos de mercado que também usam a Amazon CloudFront como uma camada de CDN, coordene a invalidação em ambas as camadas: exclua a ElastiCache chave e envie uma invalidação do CloudFront cache (ou invalidação da tag de cache) para que os usuários vejam o conteúdo atualizado nas camadas do aplicativo e da borda.
Gerenciamento de conexões
-
Use o pool de conexões — A criação de uma nova conexão TLS para cada operação de cache aumenta a latência. Mantenha um pool de conexões persistentes e reutilize-as em todas as solicitações.
-
Definir tempos limite de conexão — Use um tempo limite de conexão curto (1—2 segundos) e um tempo limite de comando mais curto (100—500 ms). Se o cache não responder rapidamente, volte para o banco de dados em vez de bloquear a solicitação.
-
Gerencie o failover normalmente — Quando ocorre um Multi-AZ failover, as conexões com o antigo primário são interrompidas. Seu pool de conexões deve detectar conexões quebradas e se reconectar automaticamente. A maioria das bibliotecas de cliente lida com isso, mas verifica o comportamento em teste.
-
Use o endpoint de configuração do cluster — Para o modo de cluster ativado, conecte-se ao endpoint de configuração em vez de endpoints de nós individuais. O endpoint de configuração encaminha automaticamente as solicitações para o fragmento correto.
Principais métricas a serem monitoradas
| Métrica | Limite | Período | Ação |
|---|---|---|---|
CacheHitRate |
< 80% |
5 min |
Investigue — a baixa taxa de acerto significa que seus TTLs podem ser muito curtos, as chaves estão mal projetadas ou o conjunto de trabalho excede a memória. |
EngineCPUUtilization |
> 70% |
5 min |
Aumente a escala (nós maiores) ou reduza a escala (mais fragmentos). Uma CPU alta indica que o cache está processando mais comandos do que ele pode manipular com eficiência. |
DatabaseMemoryUsagePercentage |
> 80% |
5 min |
Risco de despejos. Aumente a memória (amplie) ou reduza os dados armazenados (TTLs mais curtos, menos tipos de dados em cache). |
Evictions |
> 0 sustentado |
1 min |
O cache está cheio e removendo dados para abrir espaço. Aumenta os erros de cache. Aumente a memória ou reduza os TTLs em dados menos críticos. |
CurrConnections |
> 80% do tamanho do seu pool de clientes |
5 min |
Pool de conexão quase esgotado. Aumente o tamanho do pool, reduza o tempo de espera da conexão ou investigue vazamentos de conexão no código do aplicativo. Baseie o limite no tamanho do pool configurado do seu aplicativo, não no máximo do servidor (65.000). |
Perguntas frequentes
Quando devo usar o Serverless versus o baseado em nós?
Use o Serverless quando seu tráfego for imprevisível (novo mercado, picos sazonais), quando quiser evitar o planejamento de capacidade ou quando sua equipe não tiver experiência em operações de cache. Mude para o baseado em nós quando seus padrões de tráfego estiverem estáveis, você precisar de um controle refinado sobre a fragmentação ou quando sua taxa de transferência sustentada tornar a base em nós mais econômica.
Devo usar Valkey ou Redis OSS?
Use o Valkey para novas implantações. O Valkey é o mecanismo padrão para novos ElastiCache clusters, é totalmente compatível com os comandos e estruturas de dados do Redis OSS e recebe desenvolvimento contínuo. Os clusters Redis OSS existentes continuam funcionando — migre para o Valkey quando for conveniente usando a atualização do mecanismo local.
O que acontece quando o cache não está disponível?
Seu aplicativo deve tratar o cache como uma otimização, não como uma dependência. Se o cache não estiver disponível, volte a consultar diretamente o banco de dados. Os tempos de resposta serão maiores, mas o aplicativo permanecerá funcional. Quando Multi-AZ ativado, a indisponibilidade total do cache é rara — o failover para uma réplica normalmente é concluído em menos de 30 segundos.
Como faço para estimar a memória de que preciso?
Calcule: (número de itens exclusivos para armazenar em cache) × (tamanho médio por item) × (fator de sobrecarga de 1,2 para estruturas de dados Valkey). A sobrecarga varia de acordo com o tamanho do objeto e o tipo de dados — objetos menores têm uma sobrecarga proporcionalmente maior. Por exemplo, 100.000 produtos de 2 KB cada um com 1,2x de sobrecarga = aproximadamente 240 MB. Adicione dados de sessão, resultados de pesquisa e contagens de inventário. Comece com espaço livre (use 60% da memória disponível como meta) e monitore a DatabaseMemoryUsagePercentage métrica para ajustar.