Redis Gerenciado pelo Azure: bibliotecas, cache e operações de dados
Projete padrões de cache de baixa latência, escolha a camada e o cliente, conecte com segurança, manipule estruturas Redis, controle expiração e invalide dados obsoletos de aplicações de IA.
Tempo de estudo sugerido: 105 minutos • Nível intermediário • Reescrita autoral completa com versão resumida de cada tópico, avaliação comentada e laboratório guiado em Python
Por João Ricardo Dutra••Conteúdo autoral completo
1. Por que uma aplicação de IA precisa de uma estratégia de
Considere um assistente de comércio eletrônico que reúne perfil do cliente, catálogo, histórico de conversa, estado de sessão e resultados caros de modelos em milhares de chats simultâneos. Consultar o sistema de registro em cada turno aumenta latência e carga. O mantém dados reutilizados na memória para atender o caminho quente em tempo de inferior a um milissegundo, enquanto o banco durável permanece como fonte da verdade.
Explicar o serviço gerenciado, suas camadas e estratégias comuns de .
Escolher uma biblioteca e um modo de conexão compatível com a política de clustering.
Armazenar, recuperar, agrupar, expirar e remover dados com redis-py.
Aplicar -aside, invalidação explícita, , repetição, segurança, monitoramento e recuperação.
Criar e verificar um pequeno aplicativo de console Python em um recurso descartável.
O reduz o caminho quente; ele não substitui dados duráveis nem serviços de modelo.
Resumo do tópico
Use Redis para dados limitados, repetíveis e sensíveis à latência, mantendo propriedade e durabilidade no sistema de origem adequado.
2. Entender a arquitetura gerenciada do Redis
O é um armazenamento em memória operado pela Microsoft e hospedado no , baseado no Redis Enterprise. Ele preserva o protocolo Redis e acrescenta implantação gerenciada, shards paralelos, alta disponibilidade, replicação geográfica ativa-ativa, controles de segurança e monitoramento do . Aplicações dentro ou fora do podem se conectar quando a rede permitir.
Vários processos de servidor Redis, chamados shards, são distribuídos entre nós. Shards primários e réplicas ocupam nós diferentes, e um em cada nó gerencia conexões e autorrecuperação. Parte da memória fica reservada para replicação e ; portanto, dimensione pela capacidade utilizável medida, não pelo tamanho nominal inteiro.
A replicação geográfica ativa-ativa vincula instâncias em regiões diferentes. Todas podem aceitar leituras e gravações, e as alterações convergem com consistência eventual. A aplicação ainda deve direcionar tráfego para uma região saudável e não pode presumir sincronização inter-regional imediata.
Resumo do tópico
O serviço combina acesso compatível com Redis, shards, réplicas, , e operação ativa-ativa multirregional opcional.
3. Escolher o padrão de pelo ciclo de vida dos dados
Três usos comuns do .
Padrão
O que fica no Redis
Controle de atualização
de dados
Linhas do banco, catálogo, resultados de modelo
-aside, e invalidação após atualização
de conteúdo
Cabeçalho, rodapé, navegação, modelos e banners
maior ou invalidação na publicação
de sessão
Carrinho, preferências, contexto de autenticação e conversa
Expiração fixa ou deslizante da sessão
No -aside, a aplicação consulta Redis primeiro. Um acerto retorna imediatamente; uma falha lê o banco, grava uma representação reutilizável com expiração e devolve o resultado. Como o banco costuma ser maior que o , carregar sob demanda é mais realista que pré-carregar tudo. Quando a origem muda, remova ou substitua cada chave derivada que possa estar obsoleta.
Fragmentos estáticos reduzem renderização e o número de servidores Web exigido. ASP.NET pode usar o Redis Output Provider, e outros aplicam o mesmo padrão por suas abstrações de . O clustering distribui grandes conjuntos de conteúdo.
Para sessões, mantenha no apenas um identificador opaco e guarde o estado maior no Redis. Assim, o cliente não transmite a sessão completa em toda solicitação e resposta . Há integração para ASP.NET, ASP.NET Core, Node.js, Python e Java; replicação e expiração apoiam disponibilidade e limpeza.
Resumo do tópico
Dados, conteúdo compartilhado e sessões têm proprietários e expirações diferentes, mas todos ganham quando valores pequenos evitam trabalho repetido.
4. Selecionar a camada com evidências de memória e taxa de transferência
Perfis das camadas do .
Camada
Relação memória/vCPU
Uso típico
Memory Optimized
Aproximadamente 8:1
Conjuntos grandes e taxa moderada; SKUs menores para desenvolvimento
Balanced (Memory + Compute)
Aproximadamente 4:1
Cargas de produção de uso geral
Compute Optimized
Aproximadamente 2:1
Máxima taxa e comandos intensivos em CPU
Flash Optimized
RAM e flash NVMe
Dados muito grandes e mais frios, aceitando alguma latência para reduzir custo
A camada define teto de desempenho, memória utilizável, recursos de disponibilidade e custo mensal. Teste tamanho real dos valores, mistura de comandos, concorrência, rede e alta disponibilidade. Nesta edição, Flash Optimized e alguns SKUs em memória muito grandes estão em ; confirme disponibilidade e limites atuais na região.
A política de remoção decide o que sai quando a memória enche, mas não substitui planejamento. , tamanho máximo, número de chaves, custo de replicação e margem segura precisam entrar no cálculo.
Resumo do tópico
Escolha a camada por memória e taxa medidas e valide disponibilidade, status de , remoção e custo na região.
5. Relacionar biblioteca, linguagem e política de clustering
Clientes Redis comunitários comuns.
Linguagem
Biblioteca
C# / .NET
StackExchange.Redis
Java
Lettuce ou Jedis
Node.js
node_redis ou ioredis
Python
redis-py
As bibliotecas convertem em comandos Redis e são mantidas por suas comunidades, não pela equipe do serviço. Use uma versão atual e com manutenção ativa; revisite atualizações regularmente porque suporte a , conexão, confiabilidade e desempenho evoluem.
Todo cliente funciona com a política de clustering Enterprise, pois o apresenta um compatível. Na política OSS, o cliente precisa compreender topologia e do Redis . Em Python, use redis..RedisCluster em vez de redis.Redis. Essa é uma decisão de conexão, não um detalhe tardio.
Resumo do tópico
Escolha um cliente comunitário atual e confirme que a classe de conexão aceita a política de clustering da instância.
6. Projetar comandos de várias chaves para e restrições
Um em divide as chaves em de . Na política OSS, todas as chaves de um comando múltiplo precisam cair no mesmo slot, ou ocorre CROSSSLOT. Uma tag compartilhada, como user:{42}:profile e user:{42}:cart, agrupa dados relacionados, mas concentrar tráfego demais cria um shard quente.
Comportamento entre .
Configuração
Comandos permitidos entre
Clustering Enterprise
DEL, MSET, MGET, EXISTS, UNLINK, TOUCH
Bancos ativos-ativos
MGET, EXISTS, TOUCH; gravações de várias chaves ficam no mesmo slot
Clustering OSS
Comandos de várias chaves exigem o mesmo slot
Como a Microsoft controla a topologia, o clustering Enterprise bloqueia INFO, HELP, KEYSLOT, NODES e . A replicação geográfica ativa bloqueia FLUSHALL e FLUSHDB. O código da aplicação não deve depender de comandos administrativos pertencentes à plataforma.
Resumo do tópico
A posição no slot governa operações de várias chaves, e as restrições do serviço protegem topologia e dados replicados.
7. Aplicar práticas de desenvolvimento antes de aumentar capacidade
Prefira mais chaves com valores menores e divida objetos grandes.
Use para reduzir viagens de rede entre operações independentes.
Itere com SCAN; KEYS pode bloquear o servidor e não deve fazer parte do caminho de produção.
Coloque aplicação e Redis na mesma região do quando possível.
Conecte por nome do host, nunca por público sujeito a mudança.
Mantenha ; o serviço aceita 1.2 e 1.3 e exige transporte criptografado por padrão.
Para demanda excepcional de banda, teste um cliente maior ou várias conexões em round-robin.
reduz viagens, mas não é sinônimo de transação; atomicidade vem do comando ou de uma transação explícita. Meça latência dos comandos e carga do servidor para não deslocar o gargalo para a rede do cliente.
Resumo do tópico
Valores pequenos, , iteração não bloqueante, proximidade regional, hostnames e costumam ajudar antes da escala.
8. Conectar com redis-py e
e Enterprise usam a porta 10000; usa 6380. Trocar esses padrões é uma causa comum de falha. decode_responses=True converte bytes em texto; mantenha false para imagens, objetos serializados ou dados binários.
import redis
# Access-key example; prefer Microsoft Entra ID in production
client = redis.Redis(
host="<cache-name>.<region>.redis.azure.net",
port=10000,
ssl=True,
password="<access-key>",
decode_responses=True,
)
# Use decode_responses=False for images or other binary payloads.
Chaves de acesso funcionam, mas é o modelo sem senha preferido em produção. Novos habilitam essa autenticação por padrão. Conceda ao usuário, ou somente as permissões necessárias e deixe o provedor atualizar .
import redis
from azure.identity import DefaultAzureCredential
from redis_entraid.cred_provider import create_from_default_azure_credential
provider = create_from_default_azure_credential(
("https://redis.azure.com/.default",),
)
client = redis.Redis(
host="<cache-name>.<region>.redis.azure.net",
port=10000,
ssl=True,
credential_provider=provider,
decode_responses=True,
)
# With OSS clustering, use redis.cluster.RedisCluster instead.
A autenticação exige e usa o escopo ://redis..com/.default. Desabilitar chaves de acesso encerra todas as conexões atuais; planeje a transição e a reconexão.
Resumo do tópico
Use porta e cliente de corretos, prefira e trate renovação e reconexão como comportamento normal.
9. Escolher a estrutura Redis conforme a operação
Estruturas fundamentais deste capítulo.
Estrutura
Comandos úteis
Uso adequado
String
SET, , MSET, MGET
Texto, resultados serializados, e binários
HSET, HGET, HGETALL
Perfis, produtos e objetos estruturados compactos
List
LPUSH, RPUSH, LPOP, RPOP, LRANGE
Filas FIFO, pilhas LIFO e itens recentes
String numérica
INCR, DECR, INCRBY, DECRBY
Contadores atômicos e limitação de taxa
agrupam campos sob uma chave e normalmente usam menos memória que uma chave por campo. Lists preservam ordem e operam nas duas extremidades. Comandos numéricos são atômicos e evitam a corrida de ler, incrementar e gravar separadamente.
Modele os dados pelos comandos necessários, não por uma abstração genérica de chave e valor.
Resumo do tópico
Strings, , lists e contadores atômicos resolvem padrões distintos; escolha antes de definir chaves e TTLs.
10. Armazenar, recuperar, agrupar, verificar e excluir
SET e formam o par básico. HSET grava um mapeamento e HGET ou HGETALL lê um campo ou o objeto. MSET e MGET reduzem viagens entre várias strings quando o permite. Vários são chaves separadas; use para executar diversos HGETALL ou HGET com eficiência.
EXISTS funciona com todos os tipos porque verifica chaves; com várias, retorna quantas existem. DEL remove chaves inteiras e devolve a quantidade excluída. Uma chave ausente deve ser tratada como falha normal de .
Resumo do tópico
Agrupe operações independentes e interprete corretamente as contagens retornadas por EXISTS e DEL.
11. Controlar expiração com no nível da chave
Expiração sustenta invalidação automática e uso de memória. SETEX grava uma string e sua expiração atomicamente; PSETEX usa milissegundos. Para , list ou string existente, grave e aplique EXPIRE ou PEXPIRE. EXPIREAT recebe um horário Unix absoluto.
import time
# Atomic write plus expiration for a string
client.setex("session:f7c9", 3600, "user-42")
client.psetex("lock:job-1001", 5000, "worker-3")
# Any data type can receive a key-level expiration
client.expire("profile:42", 900)
client.pexpire("jobs:pending", 60_000)
client.expireat("catalog:snapshot", int(time.time()) + 7200)
ttl = client.ttl("profile:42") # -1: no expiry; -2: key absent
ttl_ms = client.pttl("profile:42")
client.persist("profile:42") # remove the expiry
informa segundos e PTTL milissegundos. -1 significa que a chave existe sem expiração; -2, que ela não existe. PERSIST remove a expiração. Como ponto inicial, use cerca de 1–5 minutos para dados muito mutáveis, 15–60 para mudanças moderadas, 1–24 horas para dados estáveis e mais de um dia para referências estáticas.
Resumo do tópico
A expiração pertence à chave, SETEX é uma gravação atômica de string, e o equilibra atualização, taxa de acerto e memória.
12. Invalidar entradas obsoletas deliberadamente
é simples, mas pode servir dados alterados antes do prazo. A invalidação manual remove ou atualiza chaves relacionadas depois de uma gravação bem-sucedida no banco. -aside combina carga sob demanda e ; limpeza por padrão usa SCAN para descobrir chaves sem bloquear.
def get_product(product_id: str, ttl: int = 600):
key = f"product:{product_id}"
cached = client.get(key)
if cached is not None:
return cached
value = read_product_from_database(product_id)
if value is not None:
client.setex(key, ttl, value)
return value
def update_product(product_id: str, value: str):
write_product_to_database(product_id, value)
client.delete(
f"product:{product_id}",
f"recommendations:{product_id}",
)
def invalidate_user(user_id: str):
# SCAN advances incrementally; KEYS can block production workloads.
for key in client.scan_iter(match=f"user:{user_id}:*", count=100):
client.delete(key)
Grave primeiro no banco e invalide depois, evitando que uma falha de recarregue a origem antiga. Para domínios muito mutáveis ou estritos, considere chaves versionadas, eventos ou write-through. Evite curingas ilimitados; um índice reverso ou conjunto pequeno e previsível de chaves é mais fácil de operar.
Resumo do tópico
limita obsolescência, invalidação após atualização a encurta, e SCAN limpa padrões incrementalmente sem o risco de KEYS.
13. Limitar conexões, falhas e repetições
redis-py usa pool automaticamente. Configure um limite compatível com a concorrência, reutilize clientes e não abra uma sessão / por solicitação. Vários pools podem distribuir demanda excepcional, mas conexões extras não corrigem saturação do servidor.
import random
import time
import redis
pool = redis.ConnectionPool(
connection_class=redis.SSLConnection,
host="<cache-name>.<region>.redis.azure.net",
port=10000,
max_connections=40,
socket_connect_timeout=2,
socket_timeout=2,
health_check_interval=30,
decode_responses=True,
)
client = redis.Redis(connection_pool=pool)
for attempt in range(3):
try:
value = client.get("model:result:42")
break
except (redis.ConnectionError, redis.TimeoutError):
if attempt == 2:
raise
time.sleep((2 ** attempt) * 0.1 + random.random() * 0.1)
Defina curtos, capture erros de conexão e permita fallback para a fonte da verdade ou resposta degradada controlada. Repita somente trabalho transitório e idempotente, com exponencial e jitter. Não repita cegamente uma gravação de resultado desconhecido.
Resumo do tópico
Pool limitado, , fallback e poucas repetições com jitter impedem que uma falha de derrube toda a aplicação.
14. Monitorar, escalar e proteger o
Observe Percentual de Memória Usada, CPU, Clientes Conectados, banda de rede, latência, , remoções e razão entre acertos e falhas. O material sugere investigar uso sustentado acima de cerca de 75% nas quatro métricas de capacidade; alertas reais devem refletir baseline, limites da camada e objetivo de resposta.
Habilite alta disponibilidade em produção e desabilite apenas em desenvolvimento/teste quando o risco for aceitável.
Use replicação geográfica ativa-ativa para várias regiões, projetando consistência eventual e de tráfego pela aplicação.
Use persistência RDB ou AOF para recuperação mais rápida no mesmo ; persistência não é backup pontual.
Use importação/exportação para cópias em conta de armazenamento e confirme incompatibilidades atuais entre persistência e replicação ativa.
Escale somente depois de identificar memória, CPU, rede, conexões ou tamanho de valor como restrição.
Observe o como dependência distribuída com compensações de capacidade, disponibilidade, consistência e recuperação.
Resumo do tópico
Métricas, taxa de acerto, latência, disponibilidade, persistência, cópia e replicação formam um único projeto operacional.
15. Laboratório guiado: executar operações de dados em Python
O exercício de origem foi planejado para cerca de 30 minutos. Use um recurso descartável e registre os resultados dos comandos.
Prepare uma assinatura do ,, Python 3.12 ou superior, a CLI do mais recente e a extensão redisenterprise instalada com az extension add --name redisenterprise.
Crie um projeto de console e instale redis, redis-entraid e -identity conforme a autenticação.
Crie o , obtenha hostname e política de clustering e conceda acesso à identidade executora.
Conecte pela porta 10000 e confirme PING.
Grave um perfil como , leia campos e agrupe duas leituras com .
Defina expiração, inspecione , remova e reaplique a expiração; exclua a chave e confirme -2.
Implemente -aside e invalidação explícita, desconecte, remova o recurso e guarde apenas anotações sem segredos.
Resumo do tópico
O laboratório comprova provisionamento, conexão segura, ,,, exclusão e limpeza em um fluxo Python repetível.
16. Revisão da avaliação e checklist de produção
A porta criptografada padrão do é 10000; 6380 pertence ao .
Use SCAN, não KEYS, para iterar chaves em produção.
setex() do redis-py grava string e expiração numa operação atômica.
-1 indica chave sem expiração; -2 indica chave ausente.
Clustering Enterprise e OSS exigem comportamentos diferentes para conexão e várias chaves.
com é a autenticação preferida para produção.
Padronize chaves e limite valores.
Escolha estruturas pela operação.
Defina ou documente por que a chave persiste.
Invalide derivados depois da atualização da origem.
Use , pool limitado, e repetição idempotente.
Monitore memória, CPU, clientes, banda, latência, remoções e acertos.
Teste alta disponibilidade e recuperação e exclua recursos de laboratório.