Có 3 phần đối với một ổ khóa:
- khóa (tên duy nhất của khóa trong cơ sở dữ liệu)
- giá trị (mã thông báo do người gọi xác định có thể được sử dụng vừa để chỉ ra ai "sở hữu" khóa và để kiểm tra xem việc mở và mở rộng khóa có được thực hiện chính xác hay không)
- thời lượng (khóa cố ý là một thứ có thời hạn hữu hạn)
Nếu không nghĩ đến giá trị nào khác, một hướng dẫn có thể tạo ra một "giá trị" phù hợp. Chúng tôi có xu hướng sử dụng tên máy (hoặc phiên bản hỗn hợp của tên máy nếu nhiều quy trình có thể cạnh tranh trên cùng một máy).
Ngoài ra, hãy lưu ý rằng việc sử dụng khóa là đầu cơ , không phải chặn . Việc bạn thất bại là hoàn toàn có thể xảy ra để lấy khóa và do đó bạn có thể cần phải kiểm tra điều này và có thể thêm một số logic thử lại.
Ví dụ điển hình có thể là:
RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
try {
// you have the lock do work
} finally {
db.LockRelease(key, token);
}
}
Lưu ý rằng nếu công việc dài dòng (đặc biệt là một vòng lặp), bạn có thể muốn thêm một số LockExtend
không thường xuyên cuộc gọi ở giữa - một lần nữa hãy nhớ kiểm tra xem có thành công không (trong trường hợp hết thời gian).
Cũng lưu ý rằng tất cả các lệnh redis riêng lẻ là nguyên tử, vì vậy bạn không cần phải lo lắng về hai hoạt động kín đáo cạnh tranh. Đối với các đơn vị đa hoạt động phức tạp hơn, giao dịch và viết kịch bản là các tùy chọn.