Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

StackExchange.Redis - Cách sử dụng LockTake / LockRelease

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 viết kịch bản là các tùy chọn.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hiệu quả của Java + Redis so với Java đơn giản cho các ứng dụng chuyên sâu về dữ liệu?

  2. Phơi sáng Redis với Bộ điều khiển Ingress Nginx

  3. redis cluster reshard [ERR] Đang gọi MIGRATE:ERR Lỗi cú pháp

  4. Sự cố trong giải mã redis-cache cho các đối tượng trong Spring-boot

  5. Làm cách nào để kết nối an toàn với Redis do Heroku lưu trữ từ dòng lệnh?