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

Tại sao Một cá thể Jedis không phải là threadsafe?

Một cá thể Jedis không phải là luồng an toàn vì nó được triển khai theo cách này. Đó là quyết định mà tác giả của thư viện đã đưa ra.

Bạn có thể kiểm tra mã nguồn của BinaryJedis, một loại siêu Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Ví dụ những dòng sau:

public Transaction multi() {
    client.multi();
    client.getOne(); // expected OK
    transaction = new Transaction(client);
    return transaction;
}

Như bạn có thể thấy trường giao dịch được chia sẻ cho tất cả các luồng bằng cá thể Jedis và được khởi tạo trong phương thức này. Sau đó, giao dịch này có thể được sử dụng trong các phương thức khác. Hãy tưởng tượng hai luồng thực hiện các hoạt động giao dịch cùng một lúc. Kết quả có thể là một giao dịch được tạo bởi một luồng được một luồng khác vô tình truy cập. Trường giao dịch trong trường hợp này là quyền truy cập trạng thái được chia sẻ mà không được đồng bộ hóa. Điều này làm cho Jedis không phải là chuỗi an toàn.

Lý do tại sao tác giả quyết định làm cho Jedis non-threadsafe và JedisPool threadsafe có thể là để cung cấp tính linh hoạt cho các máy khách để nếu bạn có môi trường đơn luồng, bạn có thể sử dụng Jedis và có được hiệu suất tốt hơn hoặc nếu bạn có môi trường đa luồng, bạn có thể sử dụng JedisPool và có được sự an toàn của chuỗi.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lỗi trạng thái phiên Azure Redis Hết thời gian chờ thực hiện EVAL, inst:1, queue:2

  2. Làm thế nào để triển khai một luồng tương lai cho cuộc gọi chặn bằng futures.rs và Redis PubSub?

  3. Làm thế nào để lấy các khóa không khớp với một mẫu cụ thể trong redis?

  4. 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?

  5. Làm thế nào để xác định thời gian thực thi của một tập lệnh Lua trong Redis?