Nexa Intelligence Docs
Data & Storage

Redis

Spesifikasi teknis Redis In-Memory Cache di Nexa, pola prefix key, manajemen session JWT, transport Redis Streams 'scrape-tasks', rate limiting, dan distributed locks.

Redis In-Memory Cache & Stream Transport

Redis bertindak sebagai lapisan penyimpanan memori berkecepatan tinggi (In-Memory Key-Value & Stream Store) di seluruh gateway F1 API Backend, A1 Scraper Controller, dan D1 AI Worker.


Matriks Penggunaan Kunci & Struktur Data

Pola Key (Prefix)Tipe DataTTL (Masa Berlaku)Modul PemilikDeskripsi & Fungsi
nexa:cache:url_hash:{md5}String30 Haria1-scraper-controllerCache hash URL untuk deteksi cepat tautan yang sudah pernah di-crawl (first-line filter).
nexa:auth:token_blacklist:{jti}StringSisa masa berlaku JWTf1-api-backendDaftar ID token JWT yang dicabut saat user Logout untuk validasi instan sub-1ms.
nexa:ratelimit:ip:{client_ip}String (Integer)60 Detikf1-api-backendSliding window counter untuk membatasi request per IP (misal: max 120 req/menit).
nexa:cache:dashboard:nationalString (JSON)5 Menitf1-api-backendResponse cache endpoint overview nasional untuk mempertahankan TTFB < 20ms.
nexa:cache:taxonomy:treeString (JSON)24 Jamf1-api-backendCache hierarki pohon taksonomi 5-Level yang jarang berubah.
nexa:worker:lock:{article_id}String10 Menitnexa-d1Distributed lock (SET NX EX) guna mencegah race condition inferensi artikel ganda.
nexa:stream:scrape-tasksStreamRetention 7 HariA1 / Scraper LegacyRedis Stream taskbus untuk pengiriman instruksi crawling ke scraper lawas.

1. Transport Redis Streams (scrape-tasks)

Untuk mendukung scraper legacy sebelum migrasi penuh ke Kafka:

Operasi Stream:

# Produser: A1 Controller mengirim tugas scraping baru
XADD scrape-tasks * job_id "9b1deb4d-3b7d-4bad" domain "kompas.com" max_pages 15

# Konsumen: Scraper Worker membaca antrean tugas dalam consumer group
XREADGROUP GROUP b1-workers worker-01 BLOCK 5000 COUNT 5 STREAMS scrape-tasks >

# Konfirmasi: Scraper menyelesaikan scraping
XACK scrape-tasks b1-workers 1726056000000-0

2. Distributed Locking & Idempotensi Worker

Untuk memastikan hanya satu worker instance yang memproses inferensi AI pada artikel yang sama:

// Implementasi Distributed Lock pada API Gateway / Worker
async function acquireArticleLock(articleId: string, instanceId: string): Promise<boolean> {
  const lockKey = `nexa:worker:lock:${articleId}`;
  // Set kunci jika belum ada (NX) dengan masa kedaluwarsa 600 detik (EX)
  const result = await redis.set(lockKey, instanceId, 'NX', 'EX', 600);
  return result === 'OK';
}

async function releaseArticleLock(articleId: string, instanceId: string): Promise<void> {
  const lockKey = `nexa:worker:lock:${articleId}`;
  const luaScript = `
    if redis.call("get", KEYS[1]) == ARGV[1] then
      return redis.call("del", KEYS[1])
    else
      return 0
    end
  `;
  await redis.eval(luaScript, 1, lockKey, instanceId);
}

3. Kebijakan Manajemen Memori

Instans Redis dikonfigurasi dengan limit alokasi memori dan kebijakan eviksi maxmemory-policy volatile-lru (kunci dengan TTL yang paling jarang digunakan akan dibuang terlebih dahulu jika RAM mendekati batas maksimal).

On this page