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

Tổng kết sê-ri gRPC: khi nào chọn gRPC thay REST, và checklist đưa service lên production đúc kết từ 11 bài

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 gRPC với REST và GraphQL để biết khi nào chọn cái nào, một cây quyết định có nên dùng gRPC không, và một checklist đưa service gRPC lên production ánh xạ về từng bài: contract-first, field number bất biến, deadline, interceptor, status code, TLS, streaming đúng chỗ, load balancing, health check, graceful shutdown.

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

Năm kiểu dữ liệu Redis: chọn đúng kiểu quyết định cả tốc độ lẫn bộ nhớ (leaderboard, bạn chung, và cái giá của sorted set)

Redis không phải chỉ là key-value string — nó có năm kiểu dữ liệu, mỗi kiểu giải một lớp bài toán. Bài này demo thật trong redis-lab cả năm: string/hash/list/set/sorted set, với use case thật (leaderboard bằng sorted set, bạn chung bằng SINTER một lệnh). Rồi đo MEMORY USAGE để thấy đánh đổi: hash 88 byte nhỏ hơn JSON 96 byte, nhưng sorted set tốn 87KB so với set 40KB cho cùng 1000 phần tử — cái giá của khả năng xếp hạng.

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

Pipeline trong Redis: cắt round-trip để throughput tăng 13 lần, và vì sao nút thắt là mạng chứ không phải Redis

Redis xử lý lệnh trong phần trăm mili-giây, nhưng nếu client gửi từng lệnh một và chờ reply, phần lớn thời gian là chờ mạng (round-trip) chứ không phải Redis làm việc. Pipeline gộp nhiều lệnh vào một lần gửi để cắt số round-trip. Bài này đo thật trong redis-lab: cùng một kết nối, SET đạt 333.889 lệnh/giây ở P=1 nhưng 4.444.444 lệnh/giây ở P=50 — nhanh ~13 lần. Và pipeline khác transaction thế nào.

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

Transaction và Lua trong Redis: ba cách làm nhiều lệnh nguyên tử, và vì sao Lua mạnh hơn MULTI

Khi nhiều client cùng trừ tồn kho hay cùng trừ tiền, race condition làm hỏng dữ liệu. Redis có ba công cụ đảm bảo nguyên tử. Bài này đo thật trong redis-lab: MULTI/EXEC chạy cả khối lệnh liền nhau; WATCH huỷ transaction khi key bị client khác đổi (bal=999 chứ không phải 949, chứng minh DECRBY bị huỷ); và script Lua trừ tồn kho CHỈ KHI đủ — đọc-kiểm-ghi chạy nguyên tử trong một EVAL, thứ MULTI không làm được vì không rẽ nhánh.

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.