Bài viết mới nhất

Tổng 2272 bài
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 9 phút

Đồng hồ và thứ tự: đo thật trên ba tiến trình — lệch đồng hồ 1 ms đã đủ để đồng hồ tường xếp 300/900 cặp gửi→nhận ngược nhân quả, Lamport và vector thì 0

Ba tiến trình Go gửi 900 thông điệp cho nhau qua HTTP, mỗi sự kiện ghi cả đồng hồ tường, Lamport và vector clock. Cặp gửi→nhận là nhân quả chắc chắn, vậy mà chỉ cần một node lệch đồng hồ 1 ms — nhỏ hơn mọi lời hứa của NTP — đồng hồ tường đã xếp 300/900 cặp ngược: nhận trước gửi. Lamport và vector sai 0 lần ở mọi độ lệch. Trong 270.000 cặp sự kiện ở hai node khác nhau, vector nhận ra 1.269 cặp đồng thời, còn Lamport vẫn gán trước sau cho 1.109 trong số đó. Và LWW theo đồng hồ tường: node có đồng hồ nhanh 20 ms thắng 200/200 dù ghi trước, bản cũ đè bản mới.

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

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 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.

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

Dijkstra với heap: vì sao đổi cách tìm đỉnh gần nhất biến 3,5 giây thành 17 mili giây

Dijkstra tìm đường đi ngắn nhất, nhưng tốc độ của nó phụ thuộc vào một chi tiết: tìm đỉnh gần nguồn nhất bằng cách nào. Bài này đo thật trong go-lab: bản quét mảng O(V²) mất 3,55 giây trên đồ thị thưa 50.000 đỉnh, còn bản dùng heap O((V+E)log V) chỉ 16,9 ms — nhanh hơn 210 lần, cùng kết quả. Nhưng trên đồ thị dày, bản mảng lại cạnh tranh.