Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2312 bài viết · Website
Lập trình 22/09/2026 7 phút

Relevance và BM25: đọc explain API để hiểu vì sao Elasticsearch xếp kết quả thế này

Elasticsearch không chỉ trả về tài liệu khớp — nó chấm điểm và xếp hạng bằng thuật toán BM25. Bài này đo thật trên es-lab bằng explain API: cùng tìm một từ, tài liệu chứa nó 3 lần được 0,645 điểm, tài liệu câu ngắn chứa 1 lần được 0,554, còn tài liệu câu dài 16 từ chỉ 0,248. Mổ xẻ từng thành phần TF, IDF, field length để biết vì sao.

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

Hàng đợi chạy cục bộ và toàn cục trong Go: vì sao mỗi P có queue riêng 256 slot

Bộ lập lịch Go không dùng một hàng đợi chung. Mỗi P giữ hàng đợi cục bộ lock-free tối đa 256 goroutine, cộng một hàng đợi toàn cục có khoá cho phần tràn. Đo thật bằng schedtrace: local queue không bao giờ vượt 256, global phình tới hàng vạn nhưng không bị bỏ đói. Go 1.23.

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

Chiến lược tăng trưởng slice trong Go: nhân đôi rồi giảm dần về 1.25x

Khi append vượt cap, Go cấp mảng nền mới lớn hơn — nhưng nhân theo hệ số nào? Đo thật tiến trình cap: slice nhỏ nhân đôi (x2.00 tới cap 512), rồi giảm dần về ~1.25x cho slice lớn (1.66 1.51 1.40 1.33). Vì sao đổi hệ số và tại sao prealloc vẫn thắng. Go 1.23.

Kiến trúc hệ thống 22/09/2026 6 phút

Consistent hashing: cách Amazon Dynamo chia dữ liệu, dựng THẬT trên Redis Cluster

Chia khoá cho N node bằng hash%N nghe hợp lý — cho tới khi thêm một node và gần như MỌI khoá phải chuyển chỗ. Dynamo (2007) giải bằng consistent hashing. Bài này dựng THẬT một Redis Cluster 3 node (16384 hash slot), nạp 20.000 khoá, thêm node thứ 4 và đo trực tiếp: chỉ 24,9% khoá phải dời (~1/N) thay vì ~75% của modulo.

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