Jobs y Cache · infrastructure/cache
Adapter listo para producciónRedis,
opcional pero listo.
Redis es el sustrato compartido de tres subsistemas acá — caching, jobs en background y rate limiting. Es opcional en dev: el cache cae a un store en memoria, así un clon fresco corre sin nada externo, y escala horizontal en el momento en que seteás REDIS_URL.
Fallback elegante por diseño
La factory de cache devuelve un store respaldado por Redis cuando REDIS_URL está presente y un LRU en memoria si no. Dev y prod de una sola instancia funcionan sin Redis; los deployments multi-instancia setean REDIS_URL y obtienen un cache distribuido sin cambiar código.
1 export const createCacheStore = ({ redisUrl, logger }) => {
2 if (!redisUrl) {
3 return new InMemoryCacheStore();
4 }
5 const redis = new Redis(redisUrl, { lazyConnect: true });
6 return new RedisCacheStore(redis);
7 };
Tres subsistemas, una dependencia
Cache
Store Redis cuando REDIS_URL está seteada, LRU en memoria si no — seguro para una instancia, requerido para multi-instancia.
Jobs
Los workers y colas de BullMQ se conectan por una conexión ioredis dedicada con la particularidad de null-retry resuelta.
Rate limiting
Cada tier del limiter (read / write / auth-ip / auth-email) tiene su propio store Redis con un prefijo de key único, así los contadores nunca colisionan.
Arranca sin nada
Los adapters opcionales hacen no-op o caen a un fallback cuando no están seteados — el boilerplate siempre arranca con el env mínimo requerido.
Referencia de configuración
Variables de entorno
REDIS_URLopcionalunset → in-memory cache; required for jobs & distributed cache
JOBS_REDIS_URLopcionaloptional dedicated Redis for BullMQ
Dónde vive
apps/server/src/infrastructure/cache/factory.tsapps/server/src/infrastructure/jobs/redis-connection.ts
Cache y colas que escalan cuando vos escalás.
Corré sin nada externo en dev; seteá una URL para ir distribuido en prod.