Backend 01/09/2026 7 phút

Một lệnh SET thiếu đúng chữ KEEPTTL biến mọi phiên đăng nhập thành bất tử — và ba lỗi Redis khác chạy hoàn hảo ở dev rồi sập ở production

Bốn lỗi có ở gần như mọi hệ thống, mỗi cái kèm số đo: khoá không TTL rò rỉ 15 MB âm thầm; KEYS chặn 38 ms ở 500 nghìn khoá và 263 ms ở 2 triệu trong khi SCAN gần như không đổi; một SET ghi đè xoá TTL làm phiên không bao giờ hết hạn; bốn khoá riêng tốn hơn một Hash 43%. Điểm chung: không cái nào báo lỗi, tất cả chỉ lộ ra ở quy mô thật.

Backend 01/09/2026 8 phút

Cửa sổ cố định cho 200 yêu cầu lọt qua trong 0,3 giây dù giới hạn là 100/giây — và cách đếm chính xác tuyệt đối ngốn gấp 1.646 lần bộ nhớ để sửa đúng 2% sai số

Giới hạn tần suất là ứng dụng phổ biến thứ hai của Redis sau cache. Cài bốn thuật toán bằng Lua rồi đo cả tốc độ, bộ nhớ lẫn độ chính xác: cửa sổ cố định đơn giản nhất nhưng để lọt gấp đôi ở ranh giới; nhật ký trượt chính xác tuyệt đối nhưng tốn 88 GB nơi cửa sổ trượt chỉ tốn 53 MB với sai số 2%. Bài học là chọn xấp xỉ đủ tốt, không đuổi theo chính xác tuyệt đối.

Backend 01/09/2026 9 phút

Bốn mươi phép đo Redis gói thành một danh sách kiểm, và ba niềm tin của chính tôi bị con số bác bỏ — cùng ba lần tôi đo sai rồi phải sửa

Chốt sê-ri 40 phần: mười con số đáng nhớ, ba quy luật lặp lại (nút thắt là lượt đi về; vượt ngưỡng là nhảy bậc không tăng dần; Redis chậm dần chứ hiếm khi báo lỗi), một danh sách kiểm chạy được trước khi lên production, và ba lần phép đo của tôi cho kết quả bất khả thi — mỗi lần đều lộ ra vì một con số vượt giới hạn vật lý hoặc không khớp phép đo trước.

Backend 01/09/2026 7 phút

Memcached đọc nhanh hơn Redis 55% và tốn ít bộ nhớ hơn 61% cho cùng một bộ đệm — nhưng khởi động lại là mất sạch, và đó mới là chỗ quyết định

Đo cả hai trên đúng cùng bài toán khoá–giá trị 100 byte. Không đường ống thì bằng nhau (nút thắt là lượt đi về). Đẩy mạnh thì Memcached thắng vì đa luồng thật, và tốn ít RAM hơn 2,6 lần vì không có lớp đối tượng đa kiểu. Nhưng nó không có lưu trữ, trần 1 MB mỗi giá trị, và không có kiểu dữ liệu nào. Câu hỏi không phải cái nào nhanh, mà là bạn sẽ cần gì trong sáu tháng tới.

Backend 01/09/2026 7 phút

Ảnh Redis chính thức tự tắt protected-mode — tôi chạy FLUSHALL từ một container khác, không mật khẩu, và nó trả về OK

docker run -d redis chạy được ngay, nhưng cấu hình mặc định là cho phòng thí nghiệm, không phải production: không mật khẩu, nghe mọi giao diện, không giới hạn bộ nhớ. Và --memory của Docker không bảo vệ được Redis — đặt nó mà quên maxmemory chỉ đổi cách Redis chết từ 'hết RAM máy chủ' thành 'container bị OOMKilled'. Kèm cấu hình tối thiểu cho môi trường thật, mỗi dòng một lý do đo được.

Backend 01/09/2026 8 phút

Đặt volatile-lru khi không khoá nào có TTL chính là tắt hẳn việc dọn dẹp — Redis từ chối ghi trong khi 166.000 khoá bỏ được vẫn nằm nguyên trong RAM

Khi Redis chạm trần bộ nhớ, chính sách maxmemory quyết định nó dọn gì. Đo tám chính sách trên cùng một phép thử: volatile-lru với dữ liệu không TTL cho kết quả y hệt noeviction (0 khoá bị đuổi, 27.610 lỗi ghi) — cái bẫy dễ vấp nhất. Và LRU của Redis là gần đúng (lấy mẫu 5 khoá) nên chỉ giữ được 545/1000 khoá nóng, trong khi LFU giữ đủ 1.000/1.000 mà không cần chỉnh gì.