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

Redis lọc theo phạm vi, sắp xếp và trả về 10 đầu tiên

Trường hợp sử dụng bạn mô tả không thể được mô hình hóa một cách trang nhã trong các giải pháp NoSQL. Đó không phải là một giới hạn của Redis.

Hãy để tôi giải thích điều đó một chút. Bạn đang chạy các truy vấn phạm vi trên một trường và sắp xếp trên một trường khác. Đây không phải là thứ mà các giải pháp NoSQL giỏi. Ví dụ:Google App Engine cấm các truy vấn như vậy. Hãy xem các Hạn chế Truy vấn GAE và đọc phần "Các thuộc tính trong Bộ lọc Bất bình đẳng Phải được Sắp xếp trước Các Thứ tự Sắp xếp Khác"

Để nhận được tất cả các kết quả phù hợp với bộ lọc bất bình đẳng, một truy vấn sẽ quét bảng chỉ mục để tìm hàng phù hợp đầu tiên, sau đó trả về tất cả các kết quả liên tiếp cho đến khi tìm thấy một hàng không khớp. Để các mũi tên liên tiếp đại diện cho tập kết quả hoàn chỉnh, các hàng phải được sắp xếp theo thứ tự của bộ lọc bất bình đẳng trước các thứ tự sắp xếp khác.

Phải nói rằng, bạn vẫn có thể chạy các truy vấn của mình một cách hiệu quả, nhưng giải pháp này sẽ không tốt.

  1. Tạo phạm vi mức lương - 0-5000, 5000-10000, 10000-15000, v.v.
  2. Tạo các tập hợp như users_with_salary:10000-15000 . Tập hợp này sẽ chứa id người dùng có mức lương trong phạm vi nhất định.
  3. Tương tự, hãy tạo các tập hợp như `users_with_rating:1-2". Tập hợp này sẽ chứa id người dùng có xếp hạng trong phạm vi nhất định
  4. Bây giờ, hãy chạy mã giả sau đây

String userids[];
for(rating = 10; rating > 0; rating--) {
  for(salary = min_salary; salary < max_salary; salary += 5000) {
      String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);
      String rating_key = "users_with_rating:" + rating + "-" + (rating+1);

      userids.append(redis.sinter(salary_key, rating_key));

      if(userids.length > 10) {
         break;
      }
   }
}

Với redis 2.6 và tập lệnh lua, bạn thậm chí có thể chạy điều này trên máy chủ lua.

Tóm lại, nếu bạn muốn chạy các truy vấn phức tạp trên dữ liệu của mình, tốt nhất là nên mô hình hóa nó trong cơ sở dữ liệu quan hệ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lỗi kênh Django - Không thể nhập BACKEND 'asgi_redis.RedisChannelLayer'

  2. Cơ sở dữ liệu NoSQL nào, nếu có, có thể cung cấp luồng * thay đổi * cho tập kết quả truy vấn?

  3. Có phải lần nào master cũng được redis instance với mức độ ưu tiên nhỏ nhất không?

  4. Chặn quyền truy cập vào khóa Redis (ServiceStack)

  5. Thêm ngày hết hạn vào Redis Cache