Turtor Docs
Prostředí

Redis

Redis konfigurace a správa

Přehled

Redis v Turtor plní tři hlavní role:

  1. Cache -- Ukládání výsledků dotazů s TTL a stampede ochranou
  2. Fronty úloh (BullMQ) -- Asynchronní zpracování emailů, notifikací, generování kurzů
  3. Pub/Sub -- Koordinace cache invalidace přes eventy

Konfigurace

Lokální vývoj

# Spuštění Redis (součást docker:up)
pnpm docker:up

# Redis je dostupný na offsetovaném portu
REDIS_HOST=localhost
REDIS_PORT=6380      # Standardní port 6379 je offsetovaný
REDIS_PASSWORD=      # Bez hesla pro dev

Produkce

V produkci Redis běží jako Docker služba s persistentním úložištěm:

redis:
  image: redis:7-alpine
  command: redis-server --appendonly yes
  volumes:
    - turtor_redis_data:/data
  healthcheck:
    test: ['CMD', 'redis-cli', 'ping']
    interval: 10s
    timeout: 5s
    retries: 5

Příznak --appendonly yes zapíná AOF (Append Only File) persistenci pro obnovu dat po restartu.

CacheService

Redis-backed cache s ochranou proti stampede efektu. Implementace je v apps/api/src/common/cache/.

TTL konstanty

KonstantaHodnotaPoužití
CACHE_TTL.STATIC1 hodinaRegiony, specializace, lokace, konfigy
CACHE_TTL.GEO24 hodinMěsta (seed data, nemění se)
CACHE_TTL.ENTITY_DETAIL15 minutCertifikace instruktorů, lokace kurzů
CACHE_TTL.STATS5 minutStatistické endpointy
CACHE_TTL.GENERATION_LOG30 minutLogy generování (immutable)

Cache skupiny

Invalidace probíhá po skupinách při změnových eventech:

SkupinaInvalidační event
regionsregion.changed
specializationsspecialization.changed
coursescourse.changed, booking.changed
instructorsinstructor.changed, booking.changed
bookingsbooking.changed
companiescompany.changed

Stampede ochrana

Metoda getOrSet() používá Redis mutex (SET NX EX 5) -- pouze jeden caller spouští factory funkci, ostatní čekají max 1 sekundu na výsledek:

const data = await this.cache.getOrSet(
  this.cache.buildKey(CACHE_GROUP.REGIONS, 'all'),
  CACHE_TTL.STATIC,
  () => this.regionsService.findAll(),
);

BullMQ fronty

Redis slouží jako backend pro BullMQ job queue systém:

FrontaÚčelRetry
emailOdesílání emailů přes Resend3x, exponential backoff
notificationsIn-app notifikace + cleanup3x, exponential backoff
course-generationAutomatické generování kurzů1x (idempotentní)
replacementAutomatická náhrada instruktorů1x
course-daily-scanDenní sken návrhů kurzů1x
sms-remindersSMS připomínky kurzůRepeatable, denně 9:00

Plánované úlohy

ÚlohaCronFronta
SMS připomínky0 9 * * * (denně 9:00)sms-reminders
Cleanup notifikací0 3 * * 0 (neděle 3:00)notifications
Kontrola náhrad*/15 * * * * (každých 15 min)replacement

SMS připomínky se automaticky plánují při startu API, ale pouze pokud je TWILIO_ENABLED=true.

Správa Redis

Kontrola stavu

# Ping test
ssh deploy@<VPS_IP> "cd /opt/apps/turtor && docker compose exec redis redis-cli ping"
# PONG

# Informace o paměti
ssh deploy@<VPS_IP> "cd /opt/apps/turtor && docker compose exec redis redis-cli info memory"

# Počet klíčů
ssh deploy@<VPS_IP> "cd /opt/apps/turtor && docker compose exec redis redis-cli dbsize"

Promazání cache (bez ovlivnění front)

# Smazání všech cache klíčů (prefix "cache:")
ssh deploy@<VPS_IP> "cd /opt/apps/turtor && \
    docker compose exec redis sh -c \"redis-cli --scan --pattern 'cache:*' | xargs -r redis-cli del\""

Příkaz FLUSHALL smaže vše včetně BullMQ front a naplánovaných úloh. Používejte cílené mazání podle prefixu.

Troubleshooting

PříznakPříčinaŘešení
Joby se nespouštějíRedis nedostupnýKontrola docker compose ps redis
Staré cache hodnotyChybí invalidační eventManuální promazání cache skupiny
Redis OOMPlná paměťNastavení maxmemory a maxmemory-policy
AOF rewrite chybaNedostatek diskudocker system df, úklid starých obrazů