Lập trình Go 22/09/2026 11 phút

singleflight trong Go: gộp 100 lời gọi trùng thành 1 để chống thundering herd

Khi cache miss một key nóng, 100 request cùng lao vào gọi DB. singleflight gộp chúng thành một lời gọi thật, 99 kia chờ và dùng chung kết quả. Đo thật: 100 goroutine cùng key khiến hàm đắt chạy đúng 1 lần thay vì 100. Cơ chế, DoChan, và cạm bẫy lỗi lan. Go 1.23.

Lập trình Go 22/09/2026 11 phút

LRU cache tự cài trong Go: get/put O(1) bằng map và danh sách liên kết đôi

LRU cache khi đầy loại phần tử lâu nhất chưa dùng. Nó cần cả tra cứu theo key và cập nhật thứ tự dùng đều O(1) — không cấu trúc đơn lẻ nào làm được cả hai. Bài tự cài trong Go bằng map + danh sách liên kết đôi, đo thật: loại đúng phần tử ít dùng nhất, get+put chỉ 79.6 ns O(1) hằng số.

Web 22/09/2026 5 phút

Cache HTTP: Cache-Control, ETag và cú 304 Not Modified — đo thật

Cache HTTP có hai cơ chế tách bạch mà nhiều người trộn lẫn: hết hạn (Cache-Control/max-age — client không hỏi server chút nào) và xác thực lại (ETag/Last-Modified — client hỏi còn mới không, server đáp 304 nếu chưa đổi). Bài này đo thật bằng nginx và curl: một request có điều kiện trả 304 không body, và ETag đổi khi nội dung đổi.

DevOps 22/09/2026 6 phút

Dockerfile cache: vì sao đổi một dòng code khiến build cài lại toàn bộ dependencies

Mỗi lệnh Dockerfile là một layer được cache; đổi một layer làm hỏng cache của MỌI layer sau nó. Đặt COPY . . trước khi cài dependencies là lỗi kinh điển: sửa một dòng code buộc build cài lại toàn bộ deps. Bài này đo thật hai Dockerfile cùng app: sau khi sửa code, bản sai mất 3.8s (cài lại deps), bản đúng chỉ 0.6s.

Lập trình 22/09/2026 6 phút

Redis cho backend từ con số 0: vì sao một kho dữ liệu chạy MỘT luồng lại nhanh hơn 340.000 lệnh/giây

Redis nhanh một cách khó tin — hơn 340.000 lệnh mỗi giây, mỗi lệnh dưới một phần mười mili-giây. Điều nghịch lý: nó xử lý lệnh trên đúng MỘT luồng. Bài mở màn sê-ri dựng Redis thật trong Docker, đo throughput bằng redis-benchmark (SET 343.642/giây, GET 346.020/giây), giải thích ba lý do tốc độ (in-memory, single-thread không khoá, I/O đa hợp), và vì sao single-thread cũng chính là lý do mọi lệnh Redis nguyên tử.

Lập trình 22/09/2026 6 phút

Cache-aside và cache stampede: khi một key nóng hết hạn, 20 request cùng đập database — và cách chặn bằng một lock

Cache-aside là pattern cache phổ biến nhất, nhưng nó có một lỗ hổng chết người: khi một key nóng hết hạn, mọi request đến cùng lúc đều miss và cùng đập vào database — cache stampede. Bài này đo thật trong redis-lab: cache HIT 1ms vs MISS 204ms; 20 client đồng thời khi key vắng gây 20 lần query DB; thêm một lock SET NX, số query DB giảm còn đúng 1. Hiểu để một đợt key hết hạn không kéo sập database.