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

Tổng 2272 bài
Lập trình 22/09/2026 8 phút

Khoá phân tán: đo thật SET NX kèm TTL — tiến trình treo quá TTL làm mất 100/100 cập nhật im lặng, DEL trần xoá khoá của người khác 100/100 lần, và fencing token chặn đủ 100 bản ghi cũ

Khoá bằng Redis SET NX PX với TTL 300 ms, vùng găng là đọc-cộng-ghi số dư trong PostgreSQL. Tiến trình A lấy khoá rồi treo 500 ms, khoá hết hạn, B lấy khoá và ghi; A tỉnh dậy ghi đè: mất 100/100 cập nhật của B, không lỗi, không log. Thêm fencing token tăng dần cấp cùng lúc với khoá và kiểm ở tầng lưu trữ: 100 bản ghi cũ bị từ chối, A biết mà làm lại, số dư đúng 200. Mở khoá bằng DEL trần: A xoá khoá của B, C vào khi B đang làm, 100/100 vòng; so chủ trước khi xoá: 0. Redlock 3 node: khi một Redis chết, một Redis đơn 0/200, Redlock 200/200 với giá một timeout mỗi lần.

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

TTL và eviction trong Redis: key tự hết hạn, và vì sao chọn sai chính sách khi đầy bộ nhớ làm hỏng cả hệ thống

Redis sống trong RAM có hạn — hai cơ chế quyết định số phận key: TTL (tự hết hạn) và eviction (đẩy key ra khi đầy). Bài này đo thật trong redis-lab: key đặt PX 150ms tự biến mất sau đó (GET trả nil); và với maxmemory 3mb, nạp 100.000 key — chính sách allkeys-lru đẩy 89.992 key để ghi vẫn thành công (bộ nhớ giữ đúng 3.00M), còn noeviction từ chối ghi với lỗi OOM. Chọn chính sách theo vai trò Redis.

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

Consistent hashing: đo thật trên một triệu khoá — thêm node thứ 11 thì modulo chuyển 90,9% khoá, vòng băm 9%, và vòng băm với hàm băm kém lệch tải 3 lần

Một triệu khoá, cụm 10 node, thêm thành 11 rồi bớt về 9. Modulo chuyển 90,9% và 90,0% khoá — gần như toàn bộ cache miss hoặc toàn bộ dữ liệu di chuyển. Vòng băm với 1.000 node ảo chuyển 9,0% và 10,1%, sát lý tưởng; jump hash 9,0% và 10,0% với 0 byte bảng. Nhưng vòng băm có hai bẫy đo được: ít node ảo thì một node gánh 27 lần node khác (3,185× so với 0,118×), và hàm băm trộn kém — FNV-1a trên chuỗi node-i#j — làm các điểm ảo dính chùm, lệch 3,026× dù có 100 node ảo. Jump hash cân nhất (1,005×) nhưng chỉ thêm bớt được node cuối; vòng băm bớt node giữa chỉ chuyển đúng khoá của node đó.

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

Distributed lock với Redis: SET NX PX, và vì sao nhả lock bằng DEL là một lỗi nguy hiểm

Khoá phân tán để chỉ một tiến trình làm một việc tại một thời điểm trên nhiều máy — nghe đơn giản nhưng viết sai một chút là hỏng dữ liệu. Bài này đo thật trong redis-lab: SET NX PX cho client A giành lock, B thất bại (nil) khi A đang giữ; và quan trọng nhất, nhả lock phải dùng token duy nhất + Lua — demo B nhả với token sai trả 0 (không phá lock của A), A nhả với token đúng trả 1. Hiểu vì sao DEL mù quáng xoá nhầm lock người khác.

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

Fuzzing với go test -fuzz, đo thật: bốn hàm đọc đầu vào ngoài với bốn lỗi, 8/8 lần fuzz crash trong 0,1 đến 1,6 giây với đầu vào thu nhỏ còn 1 đến 4 byte, file crash tự thành test hồi quy — và chính nó bắt bản sửa lần một của tôi vẫn còn tràn số

Bốn hàm nhận dữ liệu từ bên ngoài, mỗi hàm một lỗi quen thuộc: make với độ dài âm, đọc quá biên khi dấu nháy đứng cuối, tràn int64 thành thời lượng âm, độ dài tiền tố không kiểm so với dữ liệu còn lại. Fuzzing tích hợp của Go tìm ra cả bốn trong 0,1 đến 1,6 giây, với đầu vào thu nhỏ như 7-0, hai dấu nháy, một byte 0. File gây lỗi lưu trong testdata chạy lại như test thường. Bản sửa lần một của ParseDuration chỉ kiểm tràn khi đọc chữ số và bị chính corpus bắt: 8e15 giờ nhân 3600 tràn ở phép nhân đơn vị. Sửa lần hai: 10,6 triệu lượt sạch; tốc độ khoảng 470.000 lượt một giây trên 10 CPU.

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

Tổng kết sê-ri kiểm thử backend đo thật: khung chọn loại test theo câu hỏi cần trả lời, bảng 11 bộ số đo gom lại, và checklist CI — cả sê-ri chạy lại hết 1,1 giây thường, 5,6 giây với -race, còn deadlock của phần 10 kẹt 2/2 dưới -race

Phần cuối gom mười một phần thành một khung: mười hai câu hỏi mà một bộ test backend phải trả lời, mỗi câu ứng với một loại test và một số đo thật trong sê-ri. Chạy lại toàn bộ chín mô-đun demo: 75 test hết 1,03 giây chạy thường, 5,61 giây với -race, và lần đầu -race mất 17 giây chỉ vì biên dịch lại phụ thuộc có đo đạc. Deadlock thứ tự khoá của phần 10 từng không kẹt lần nào ở chạy thường, dưới -race kẹt 2/2 tới hết timeout. Kèm checklist CI: cái gì chạy mỗi commit, cái gì theo lịch, và hai thứ không nên làm.