Jobs y Cache · infrastructure/cache

Adapter listo para producción

Redis,
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.

factory.ts
 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_URLopcional

    unset → in-memory cache; required for jobs & distributed cache

  • JOBS_REDIS_URLopcional

    optional dedicated Redis for BullMQ

Dónde vive

  • apps/server/src/infrastructure/cache/factory.ts
  • apps/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.