2015-10-02 12 views
5

Tôi có hai bộ được sắp xếp và muốn tạo giao lộ, ví dụ: (age BETWEEN 25, 35) AND (salary BETWEEN 250, 350)Giao điểm của hai hoặc nhiều bộ được sắp xếp

Có cách nào tốt hơn về hiệu quả hơn:

ZUNIONSTORE t_age 1 age WEIGHTS 1 
ZREMRANGEBYSCORE t_age -inf (25 
ZREMRANGEBYSCORE t_age (35 +inf 
ZINTERSTORE result 2 salary t_age WEIGHTS 1 0 
ZRANGEBYSCORE result 250 350 
+1

Bạn có nghĩa là 'ZINTERSTORE kết quả 2 mức lương t_age WEIGHTS 1 0 ' bằng số không? – thepirat000

+0

Một lệnh giả định ZRANGEBYSCORESTORE lưu trữ kết quả sẽ giúp tổng hợp dữ liệu. Cũng là một phiên bản độc quyền của ZREMRANGEBYSCORE ... – thepirat000

+0

Kiểm tra [this] (https://groups.google.com/forum/#!searchin/redis-db/ZRANGEBYSCORE/redis-db/8TBbISxd244/Rtl5VNdQWAMJ) – thepirat000

Trả lời

3

Trước tiên, bạn nên kiểm tra mà ZSET có yếu tố ít hơn với ZCARD, và tạo bản sao và cắt một ngắn hơn.

Thứ hai, bạn để lại 2 lần còn lại. Bạn có thể sử dụng lại cùng một phụ trang ZSET để dọn dẹp nhanh hơn.

Tôi cũng muốn đề xuất DUMPRESTORE cho bản sao, nhưng đối với trường hợp bộ được sắp xếp, ZUNIONSTORE thực sự nhanh hơn nhiều. Dưới đây là một thời gian của cả hai cho một yếu tố 1M thiết lập:

1) 1) (integer) 14 
    2) (integer) 1444165498 
    3) (integer) 936762 
    4) Complexity info: N:1000000,M:1000000 
    5) 1) "ZUNIONSTORE" 
     2) "temp3" 
     3) "1" 
     4) "temp1" 
     5) "WEIGHTS" 
     6) "1" 
2) 1) (integer) 13 
    2) (integer) 1444165421 
    3) (integer) 3166360 
    4) 
    5) 1) "evalsha" 
     2) "48286113cfe4b389d516e98646e5f4e086decc34" 
     3) "2" 
     4) "temp1" 
     5) "temp2" 
     6) "0" 
+1

Đây thực sự là câu trả lời ban đầu tôi có trong đầu. Trong khi nhận xét về cardinality rất quan trọng, tôi đoán được bối cảnh tuổi/tiền lương mà cả hai nhóm đều có cùng thành viên. Nhưng sau đó tôi nghĩ về một thứ khác mà sau khi điểm chuẩn thực hiện ~ x35 tốt hơn. Tôi dự định sẽ chia sẻ điều đó tại Ngày phát triển Redis sắp tới ... vì vậy hãy chú ý theo dõi :) –

+0

@ItamarHaber có liên quan đến kịch bản lệnh lua không? –

+0

Hiện tại, có. –

4

Vì vậy, các ý tưởng tôi đã là sử dụng một cấu trúc dữ liệu khác nhau, cụ thể là một quadtree, để đạt được cùng một loại truy vấn hiệu quả hơn. Bạn có thể thấy POC nhỏ của tôi (Redis Quadtree in Hash) được tạo với "hướng đối tượng" Lua tại: https://gist.github.com/itamarhaber/c1ffda42d86b314ea701

Lưu ý: bạn nên biết rằng điều này đã gây ra một cuộc thảo luận cực kỳ thú vị trước, trong và sau Ngày phát triển Redis. Kết quả trung gian là indexing page mới nhưng trong tương lai gần Redis có khả năng được thêm vào với API cấp cao hơn sẽ làm cho việc lập chỉ mục n-chiều tầm thường để sử dụng.

+1

Điều đó thật tuyệt; tnx để giúp chức năng này đi vào lõi Redis. –

Các vấn đề liên quan