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 khóa 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 khóa 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 khóa), 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ả khóa an toàn: chỉ xóa nếu token khớp (dùng script Lua so sánh-rồi-xóa nguyên tử) → tránh xóa nhầm khóa 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 khóa ở đa số node). Cảnh báo quan trọng: GC pause/đồng hồ lệch 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ì khóa phân tán.