Preparación para la Certificación Microsoft AI-200
Azure Managed Redis: bibliotecas, caché y operaciones de datos
Diseña patrones de caché de baja latencia, elige el nivel y el cliente, conecta con seguridad, manipula estructuras Redis, controla la expiración e invalida datos obsoletos de aplicaciones de IA.
Tiempo de estudio sugerido: 105 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio guiado en Python
Por João Ricardo Dutra••Contenido original completo
1. Por qué una aplicación de IA necesita una estrategia de caché
Piensa en un asistente de comercio electrónico que combina perfil, catálogo, historial de conversación, sesión y resultados costosos de modelos durante miles de chats simultáneos. Consultar el sistema de registro en cada turno aumenta latencia y carga. mantiene los datos reutilizados en memoria para responder en tiempo de caché inferior a un milisegundo, mientras la base duradera sigue siendo la fuente de verdad.
Explicar el servicio administrado, sus niveles y los patrones comunes de caché.
Elegir una biblioteca y un modo de conexión compatibles con la directiva de clustering.
Almacenar, recuperar, agrupar, expirar y eliminar datos con redis-py.
Aplicar -aside, invalidación explícita, , reintentos, seguridad, supervisión y recuperación.
Crear y comprobar una aplicación de consola Python contra un recurso desechable.
La caché acorta la ruta activa; no sustituye los datos duraderos ni los servicios de modelos.
Resumen del tema
Usa Redis para datos limitados, repetibles y sensibles a latencia, y conserva propiedad y durabilidad en el sistema de origen.
2. Comprender la arquitectura administrada de Redis
es un almacén en memoria operado por Microsoft y hospedado en sobre Redis Enterprise. Conserva el protocolo Redis y agrega implementación administrada, particiones paralelas, alta disponibilidad, replicación geográfica activa-activa, controles de seguridad y supervisión de . Las aplicaciones dentro o fuera de pueden conectarse cuando la red lo permita.
Varios procesos de servidor Redis, o shards, se distribuyen entre nodos. Los shards principales y las réplicas ocupan nodos distintos, y un por nodo administra conexiones y autorreparación. Parte de la memoria se reserva para replicación y conmutación por error; dimensiona por capacidad útil medida y no por todo el tamaño anunciado.
La replicación geográfica activa-activa enlaza instancias de varias regiones. Todas aceptan lecturas y escrituras y los cambios convergen con coherencia eventual. La aplicación aún debe dirigir tráfico a una región sana y no asumir sincronización inmediata entre regiones.
Resumen del tema
El servicio combina acceso compatible con Redis, shards, réplicas, , conmutación y operación activa-activa multirregional opcional.
3. Elegir el patrón de caché según el ciclo de vida
Tres usos comunes de .
Patrón
Qué guardar en Redis
Control de frescura
Caché de datos
Filas, catálogo y resultados de modelos
-aside, e invalidación al actualizar
Caché de contenido
Encabezados, pies, navegación, plantillas y banners
largo o invalidación al publicar
Almacén de sesión
Carrito, preferencias, autenticación y conversación
Expiración fija o deslizante
En -aside, la aplicación consulta Redis primero. Un acierto vuelve de inmediato; un error lee la base, guarda una representación reutilizable con expiración y devuelve el resultado. Como la base suele ser mayor que la caché, cargar bajo demanda es más práctico que precargar todo. Cuando cambia el origen, elimina o reemplaza cada clave derivada que pueda quedar obsoleta.
Los fragmentos estáticos reducen renderizado y servidores web. ASP.NET puede usar Redis Output Provider y otros marcos aplican la misma idea mediante sus abstracciones de caché. El clustering distribuye conjuntos grandes de contenido.
Para las sesiones, deja en la solo un identificador opaco y guarda el estado mayor en Redis. Así no se transmite toda la sesión en cada solicitud y respuesta . Hay integración con ASP.NET, ASP.NET Core, Node.js, Python y Java; replicación y expiración ayudan a la disponibilidad y limpieza.
Resumen del tema
Datos, contenido y sesiones tienen propietarios y caducidades distintas, pero se benefician cuando valores pequeños evitan trabajo repetido.
4. Seleccionar el nivel con evidencias de memoria y rendimiento
Perfiles de niveles de .
Nivel
Relación memoria/vCPU
Uso típico
Memory Optimized
Aproximadamente 8:1
Conjuntos grandes y rendimiento moderado; SKU menores para desarrollo
Balanced (Memory + Compute)
Aproximadamente 4:1
Cargas generales de producción
Compute Optimized
Aproximadamente 2:1
Máximo rendimiento y comandos intensivos en CPU
Flash Optimized
RAM y flash NVMe
Datos enormes y fríos, aceptando algo de latencia por menor coste
El nivel fija techo de rendimiento, memoria útil, disponibilidad y coste mensual. Prueba tamaños reales, mezcla de comandos, concurrencia, red y alta disponibilidad. En esta edición, Flash Optimized y algunos SKU en memoria de gran tamaño están en ; comprueba disponibilidad y límites actuales en la región.
La directiva de expulsión decide qué sale al llenarse la memoria, pero no reemplaza la planificación. , tamaño máximo, número de claves, sobrecarga de replicación y margen seguro deben incluirse.
Resumen del tema
Elige el nivel con memoria y rendimiento medidos y valida región, , expulsión y coste.
5. Relacionar biblioteca, lenguaje y directiva de clustering
Clientes Redis comunitarios comunes.
Lenguaje
Biblioteca
C# / .NET
StackExchange.Redis
Java
Lettuce o Jedis
Node.js
node_redis o ioredis
Python
redis-py
Las bibliotecas convierten sus en comandos Redis y las mantienen sus comunidades, no el equipo del servicio. Usa una versión actual y mantenida y revisa actualizaciones porque la conexión, el soporte de clúster, la confiabilidad y el rendimiento evolucionan.
Todo cliente funciona con clustering Enterprise porque el expone un compatible. Con OSS, el cliente debe entender topología y ranuras de Redis . En Python usa redis..RedisCluster, no redis.Redis. Es una decisión de conexión, no un detalle posterior.
Resumen del tema
Elige un cliente comunitario actual y confirma que su clase de conexión admite la directiva de clustering.
6. Diseñar comandos de varias claves para ranuras y restricciones
Un clúster divide claves entre ranuras . Con OSS, todas las claves de un comando múltiple deben ocupar la misma ranura o aparece CROSSSLOT. Una etiqueta compartida, como user:{42}:profile y user:{42}:cart, agrupa claves relacionadas, pero demasiado tráfico concentrado crea un shard caliente.
Comportamiento entre ranuras.
Configuración
Comandos permitidos entre ranuras
Clustering Enterprise
DEL, MSET, MGET, EXISTS, UNLINK, TOUCH
Bases activas-activas
MGET, EXISTS, TOUCH; escrituras múltiples en una ranura
Clustering OSS
Varias claves requieren la misma ranura
Como Microsoft controla la topología, Enterprise bloquea INFO, HELP, KEYSLOT, NODES y . La replicación geográfica activa bloquea FLUSHALL y FLUSHDB. El código no debe depender de comandos administrativos que pertenecen a la plataforma.
Resumen del tema
La ranura determina el comportamiento multiclave y las restricciones administradas protegen topología y datos replicados.
7. Aplicar buenas prácticas antes de escalar
Prefiere más claves con valores pequeños y divide objetos grandes.
Usa canalización para reducir viajes de red entre operaciones independientes.
Itera con SCAN; KEYS puede bloquear el servidor y no debe usarse en producción.
Coloca la aplicación y Redis en la misma región de cuando sea posible.
Conecta por nombre de host, no por una pública que puede cambiar.
Mantén ; el servicio admite 1.2 y 1.3 y exige transporte cifrado de forma predeterminada.
Para demanda excepcional de ancho de banda, prueba un cliente mayor o varias conexiones round-robin.
La canalización reduce viajes, pero no es una transacción: la atomicidad depende del comando o de una transacción explícita. Mide latencia y carga para no mover el cuello a la red cliente.
Resumen del tema
Valores pequeños, canalización, iteración no bloqueante, proximidad, hostnames y suelen ayudar antes de aumentar capacidad.
8. Conectar con redis-py y
y cachés Enterprise usan el puerto 10000; usa 6380. Confundirlos causa errores. decode_responses=True convierte bytes en texto; déjalo false para imágenes, objetos serializados o datos binarios.
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.
Las claves de acceso funcionan, pero es el modelo sin contraseña preferido en producción. Los nuevos cachés lo habilitan de forma predeterminada. Concede al usuario, o solo los permisos necesarios y deja que el proveedor actualice .
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.
requiere y usa el ámbito ://redis..com/.default. Deshabilitar claves de acceso termina todas las conexiones actuales; planifica transición y reconexión.
Resumen del tema
Usa puerto y cliente de clúster correctos, prefiere y trata renovación y reconexión como operaciones normales.
9. Elegir la estructura Redis según la operación
Estructuras principales del capítulo.
Estructura
Comandos
Uso
String
SET, , MSET, MGET
Texto, resultados serializados, indicadores y binarios
HSET, HGET, HGETALL
Perfiles, productos y objetos compactos
List
LPUSH, RPUSH, LPOP, RPOP, LRANGE
Colas FIFO, pilas LIFO y elementos recientes
String numérica
INCR, DECR, INCRBY, DECRBY
Contadores atómicos y límites de velocidad
Los agrupan campos bajo una clave y suelen usar menos memoria que una clave por campo. Las listas conservan orden y trabajan en ambos extremos. Los comandos numéricos son atómicos y evitan la carrera de leer, incrementar y escribir por separado.
Modela los datos a partir de los comandos necesarios y no de una abstracción genérica.
Resumen del tema
Strings, , listas y contadores resuelven patrones distintos; elige antes de diseñar claves y .
10. Almacenar, recuperar, agrupar, comprobar y eliminar
SET y forman el par básico. HSET escribe un mapa y HGET o HGETALL lee un campo o todo el objeto. MSET y MGET reducen viajes entre varias strings cuando el clúster lo permite. Varios son claves separadas; usa una canalización para varios HGETALL o HGET.
EXISTS funciona con todo tipo porque comprueba claves; con varias devuelve cuántas existen. DEL elimina claves completas y devuelve la cantidad. Una clave ausente es un error normal de caché, no un fallo de aplicación.
Resumen del tema
Agrupa operaciones independientes e interpreta las cuentas devueltas por EXISTS y DEL.
11. Controlar la expiración con en la clave
La expiración sostiene invalidación automática y memoria. SETEX escribe una string y su caducidad atómicamente; PSETEX usa milisegundos. Para , lista o string existente, escribe y aplica EXPIRE o PEXPIRE. EXPIREAT recibe una hora Unix absoluta.
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
devuelve segundos y PTTL milisegundos. -1 significa que la clave existe sin expiración; -2 que no existe. PERSIST elimina la expiración. Como inicio, usa 1–5 minutos para datos frecuentes, 15–60 para cambio moderado, 1–24 horas para estables y más de un día para referencias estáticas.
Resumen del tema
La caducidad pertenece a la clave, SETEX es atómico y el equilibra frescura, aciertos y memoria.
12. Invalidar entradas obsoletas deliberadamente
es sencillo, pero puede servir datos cambiados antes del plazo. La invalidación manual elimina o actualiza las claves relacionadas después de escribir con éxito en la base. -aside combina carga bajo demanda y ; la limpieza por patrón usa SCAN sin 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)
Escribe primero en la base e invalida después para impedir que una falta de caché recargue el origen antiguo. Para dominios de mucha escritura o coherencia estricta, considera claves versionadas, eventos o write-through. Evita comodines ilimitados; un índice inverso o conjunto pequeño de claves es más operable.
Resumen del tema
limita obsolescencia, invalidar tras actualizar la reduce y SCAN limpia patrones sin el riesgo productivo de KEYS.
13. Limitar conexiones, fallos y reintentos
redis-py usa automáticamente. Configura un máximo adecuado, reutiliza clientes y evita abrir / por solicitud. Varios pools pueden repartir demanda excepcional, pero más conexiones no corrigen un servidor saturado.
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)
Define breves, captura errores y permite recurrir a la fuente de verdad o responder de forma degradada. Reintenta solo trabajo transitorio e idempotente con exponencial y jitter. No repitas a ciegas una escritura cuyo resultado sea desconocido.
Resumen del tema
Pool limitado, , degradación controlada y pocos reintentos con jitter aíslan una incidencia de caché.
14. Supervisar, escalar y proteger la caché
Supervisa Porcentaje de memoria usada, CPU, Clientes conectados, ancho de banda, latencia, , expulsiones y relación acierto/error. El material propone investigar uso sostenido por encima de aproximadamente 75% en las cuatro métricas de capacidad; las alertas reales deben reflejar línea base, límites y objetivo de respuesta.
Habilita alta disponibilidad en producción; desactívala solo en desarrollo o prueba cuando el riesgo sea aceptable.
Usa replicación geográfica activa-activa entre regiones, diseñando coherencia eventual y conmutación de tráfico en la aplicación.
Usa persistencia RDB o AOF para recuperar más rápido el mismo caché; no es copia de seguridad puntual.
Usa importación/exportación para copias en una cuenta de almacenamiento y confirma incompatibilidades actuales con replicación activa.
Escala después de identificar si el límite es memoria, CPU, red, conexiones o tamaño del valor.
Observa la caché como dependencia distribuida con compromisos de capacidad, disponibilidad, coherencia y recuperación.
Resumen del tema
Métricas, aciertos, latencia, disponibilidad, persistencia, copias y replicación forman un solo diseño operativo.
15. Laboratorio guiado: realizar operaciones desde Python
El ejercicio de origen dura unos 30 minutos. Usa un recurso desechable y registra los resultados de cada comando.
Prepara una suscripción de ,, Python 3.12 o posterior, la última CLI de y la extensión redisenterprise instalada con az extension add --name redisenterprise.
Crea un proyecto de consola e instala redis, redis-entraid y -identity según la autenticación.
Crea , obtén hostname y clustering y concede acceso a la identidad ejecutora.
Conecta por 10000 y comprueba PING.
Guarda un perfil como , lee campos y agrupa dos lecturas con canalización.
Aplica expiración, inspecciona , quítala y reaplica; elimina la clave y confirma -2.
Implementa -aside e invalidación, desconecta, elimina el recurso y conserva solo notas sin secretos.
Resumen del tema
El laboratorio prueba aprovisionamiento, conexión segura, , canalización, , eliminación y limpieza en Python.
16. Revisión de evaluación y lista de producción
El puerto cifrado predeterminado de es 10000; 6380 corresponde a .
Usa SCAN en lugar de KEYS para iterar claves en producción.
setex() de redis-py guarda una string y su expiración atómicamente.
-1 indica una clave sin caducidad; -2, una clave ausente.
Enterprise y OSS tienen requisitos diferentes para conexión y varias claves.
con es la autenticación de producción preferida.
Normaliza claves y limita valores.
Elige estructuras según la operación.
Define o documenta por qué persiste.
Invalida derivados tras actualizar el origen.
Usa canalización, pool limitado, y reintento idempotente.
Supervisa memoria, CPU, clientes, red, latencia, expulsiones y aciertos.
Prueba alta disponibilidad y recuperación y elimina recursos de laboratorio.