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

Tổng kết sê-ri Redis: khi nào dùng Redis khi nào không, và checklist vận hành đúc kết từ 11 bài đo thật

Mười một bài, hàng chục phép đo thật — giờ gộp lại thành quyết định dùng được. Bài tổng kết này so Redis với Memcached và database để biết khi nào chọn cái nào, một cây quyết định có nên dùng Redis, và một checklist vận hành ánh xạ về từng bài: kiểu dữ liệu, pipeline, Lua nguyên tử, TTL và eviction, Streams, lock, rate limit, persistence, tránh big key. Redis đi TRƯỚC database, không thay database.

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

Linear vs binary search: binary nhanh 1.125 lần, nhưng không phải lúc nào cũng nên dùng

Binary search O(log n) nghe là biết thắng linear O(n). Bài này đo thật trong go-lab: ở N=262.144, binary nhanh hơn 1.125 lần một lần tìm. Nhưng binary đòi mảng đã sắp — và chi phí sort trước (306 µs) đổi cục diện: nếu chỉ tìm 1-2 lần trên mảng chưa sắp, linear thắng. Cộng thêm yếu tố cache khiến ở N nhỏ binary chỉ nhỉnh 3,7 lần.

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

Quicksort, mergesort hay sort.Ints? Đo thật bốn cách sắp xếp và ba điều bất ngờ

O(n²) chậm hơn O(n log n) — ai cũng biết. Nhưng đo thật trong go-lab cho thấy nhiều thứ sách không nói: insertion sort O(n²) lại NHANH HƠN quicksort tự viết ở N=1.000; quicksort tự viết thua mergesort vì cấp phát bộ nhớ; và sort.Ints của thư viện chuẩn (introsort) đánh bại mọi bản tự viết. Cài đặt quan trọng ngang độ phức tạp.

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

Hash table O(1): phép màu tra cứu — và ba cách nó sụp đổ về O(n)

Map/dict cho tra cứu O(1) — nhanh bất kể dữ liệu lớn cỡ nào. Bài này đo thật trong go-lab: hashtable và map Go giữ ~1-21 ns dù N tăng 256 lần, trong khi quét slice tăng tuyến tính tới 32 µs. Nhưng O(1) chỉ là trung bình: hàm băm tệ (mọi key về một bucket) làm tra cứu chậm gấp 11.874 lần, và quên pre-size map khiến chèn chậm gấp đôi vì rehash.

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

Bốn kiểu RPC của gRPC: unary, server/client/bidirectional streaming — thứ REST không có sẵn

REST chỉ có một kiểu: một request, một response. gRPC có bốn, nhờ HTTP/2 cho phép streaming hai chiều ngay trong contract. Bài này chạy thật cả bốn trong go-lab: unary Double(21) trả 42; server streaming CountUp(5) trả về 5 message; client streaming SumAll gửi 4 nhận 1 (total=100); bidirectional RunningSum gửi/nhận xen kẽ 3 lần. Chỉ cần thêm từ khoá stream vào .proto, và biết khi nào dùng kiểu nào.

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

BFS, DFS và cái giá của ma trận kề: vì sao duyệt đồ thị thưa bằng ma trận chậm hơn 344 lần

BFS và DFS cùng duyệt mọi đỉnh trong O(V+E) — khác nhau ở thứ tự thăm, không ở tốc độ. Nhưng cách BIỂU DIỄN đồ thị thì khác nhau một trời một vực. Bài này đo thật trong go-lab: trên đồ thị thưa 20.000 đỉnh, ma trận kề tốn 391 MB và duyệt chậm hơn danh sách kề 344 lần, trong khi danh sách chỉ dùng 1,68 MB. Vì sao, và khi nào ma trận mới đáng dùng.