Khi nhiều instance/tiến trình trên nhiều máy cần truy cập một tài nguyên dùng chung theo kiểu loại trừ lẫn nhau (chỉ một cái được làm tại một thời điểm), mutex/lock trong một tiến trình là không đủ — nó chỉ điều phối các thread trong cùng process, không thấy các instance khác. Cần một khoá phân tán ở một hệ chia sẻ (Redis, ZooKeeper, etcd).
Ví dụ tránh chạy trùng: chỉ một instance được gửi báo cáo hằng đêm, hoặc xử lý một job.
Redis làm khoá cơ bản bằng một lệnh atomic:
- SET lock_key <token-ngẫu-nhiên> NX PX <ttl> — NX chỉ tạo nếu key chưa tồn tại (giành khoá), PX <ttl> đặt thời hạn tự hết để khỏi kẹt vĩnh viễn nếu holder chết trước khi nhả.
- Nhả khoá an toàn: chỉ xoá nếu token khớp (dùng script Lua so sánh-rồi-xoá atomic) → tránh xoá nhầm khoá của người khác đã giành lại sau khi mình hết hạn.
Cho yêu cầu an toàn cao hơn khi có nhiều Redis master, Redis mô tả thuật toán Redlock (giành khoá ở đa số node). Cảnh báo quan trọng: GC pause / lệch đồng hồ (clock skew) có thể khiến TTL hết trong khi holder tưởng còn giữ → nên dùng fencing token (số tăng dần) để tài nguyên từ chối thao tác đến muộn. Và cân nhắc: nhiều bài toán nên giải bằng atomic operation/unique constraint ở DB thay vì khoá phân tán.