Task A — D1 reads cho /api/content/posts

Trước

  • SELECT COUNT(*) ... → 5772 rows_read mỗi request listing.
  • SELECT ... LIMIT 10 OFFSET n → 10 rows_read.
  • Tổng: 5782 rows_read / request.

Đã thử và loại

SELECT ..., COUNT(*) OVER() AS total ... LIMIT 10 → 23089 rows_read, 3.3s. Window function materialize toàn bộ partition trước LIMIT → tệ hơn 4x. Không dùng.

Chốt

  • cachedTotal() cache COUNT theo isolate, TTL 5 phút; invalidate khi save/delete post/product.
  • Mỗi isolate: lần đầu 5772 rows_read, 299 request tiếp theo trong 5 phút: 0.
  • Công thức: rows_read/request ≈ 5772/(1 + 300·hit_rate) + size.
  • Admin thêm/xoá bài → gọi totalCache.x.at = 0 nên listing cập nhật ngay ở isolate đó; isolate khác trễ tối đa 5 phút (chấp nhận: trang listing công khai, không phải số liệu kế toán).

Verify

node tmp-post/content-check.mjs → 6/6 PASS trên production.

Bài viết liên quan