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()cacheCOUNTtheo 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 = 0nê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.