# Phase 8 — Caching + Performance

วันที่: 2026-02-24

## สิ่งที่ปรับแล้ว

1) **เพิ่ม L1 Memory Cache (เหนือ DB cache)**
- ไฟล์: `src/live/cache.ts`
- `getLiveCache()` จะอ่านจาก memory ก่อน แล้วค่อย fallback DB
- ผลลัพธ์ response เพิ่ม `cacheLayer: "memory" | "db"` เพื่อ debug ได้ชัด

2) **SingleFlight ป้องกันยิงซ้ำพร้อมกัน**
- ไฟล์: `src/live/cache.ts`, `src/index.ts`
- เพิ่ม `runSingleFlight()` สำหรับรวมคำขอ concurrent key เดียวกัน
- ใช้กับทั้ง:
  - `/live/accounts` ตอน cache miss
  - `/live/dashboard` ตอน cache miss
- ลด upstream burst / ลด duplicate compute

3) **Parallel fetch สำหรับหลาย token source**
- ไฟล์: `src/index.ts`
- `loadAccountsBySources()` เปลี่ยนจาก loop ทีละ source -> worker แบบ concurrency limit
- ใช้ค่า `LIVE_ACCOUNTS_FETCH_CONCURRENCY` (default 4)

4) **Cache tuning ผ่าน env**
- ไฟล์: `src/config.ts`, `.env.example`
- รองรับ:
  - `LIVE_ACCOUNTS_CACHE_TTL_SECONDS`
  - `LIVE_DASHBOARD_CACHE_TTL_SECONDS`
  - `LIVE_ACCOUNTS_FETCH_CONCURRENCY`
  - `LIVE_CACHE_L1_TTL_SECONDS`
  - `LIVE_CACHE_L1_MAX_ENTRIES`
  - `LIVE_CACHE_PRUNE_INTERVAL_SECONDS`

5) **Auto-prune cache table**
- ไฟล์: `src/live/cache.ts`
- ลบ row หมดอายุเป็นช่วง ๆ (best effort) ลดขนาดตาราง cache

## Metrics ที่เพิ่ม

- `live_cache_hit_accounts_l1`
- `live_cache_hit_dashboard_l1`
- `live_singleflight_leader_accounts`
- `live_singleflight_shared_accounts`
- `live_singleflight_leader_dashboard`
- `live_singleflight_shared_dashboard`

## Test coverage ที่เพิ่ม

- ไฟล์: `tests/live-cache.test.ts`
  - ตรวจ L1/DB layer behavior
  - ตรวจ singleflight coalescing ทำงานจริง

