2012-05-08 29 views
18

Giả sử tôi có một bộ (hoặc tập hợp hoặc danh sách được sắp xếp nếu điều đó sẽ tốt hơn) A trong số 100 đến 1000 chuỗi.Redis: Làm thế nào để giao một tập hợp "bình thường" với một tập hợp được sắp xếp?

Sau đó, tôi có một bộ được sắp xếp B của nhiều chuỗi khác, giả sử một triệu.

Bây giờ C nên là giao điểm của MộtB (của chuỗi tất nhiên).

Tôi muốn có mọi bộ (X, SCORE_OF_X_IN_B) trong đó X ở số C.

Bất kỳ ý tưởng nào?

tôi có hai ý tưởng:

  1. Interstore
    • cửa hàng của một một bộ sắp xếp với tất cả các điểm số được 0
    • interstore đến D
    • có được tất cả các mục của D
    • xóa D
  2. vòng lặp đơn giản trong ứng dụng
    • lặp trên Một trong programm khách hàng của tôi
    • get zscore cho mỗi chuỗi

Trong khi 1. có quá nhiều chi phí về phía redis (Phải viết cho thí dụ. Trang redis nói khá phức tạp, quá http://redis.io/commands/zinterstore), 2. sẽ có | A | kết nối cơ sở dữ liệu và sẽ không phải là một lựa chọn tốt.

Có lẽ tôi có thể viết một kịch bản redis/lua mà sẽ làm việc như zscore nhưng với một số tùy ý các chuỗi, nhưng tôi không chắc chắn nếu hoster của tôi cho phép các kịch bản ...

Vì vậy, tôi chỉ muốn hỏi SO, nếu có một giải pháp thanh lịch và nhanh chóng có sẵn mà không cần kịch bản!

Trả lời

32

Có một giải pháp đơn giản cho vấn đề của bạn: ZINTERSTORE sẽ hoạt động với SETZSET. Hãy thử:

redis> sadd foo a 
(integer) 1 
redis> zadd bar 1 a 
(integer) 1 
redis> zadd bar 2 b 
(integer) 1 
redis> zinterstore baz 2 foo bar AGGREGATE MAX 
(integer) 1 
redis> zrange baz 0 -1 withscores 
1) "a" 
2) "1" 

Edit: tôi thêm AGGREGATE MAX trên, kể từ redis sẽ cung cấp cho mỗi thành viên của (không sắp xếp) thiết foo điểm mặc định của 1, và SUM rằng với bất cứ điểm nó có trong (được sắp xếp) thiết lập bar.

+2

Đây gần như chính xác những gì tôi đã viết trong câu hỏi của tôi (xem ở trên, điểm 1). Tôi cũng đã viết rằng tôi đánh giá giải pháp này là quá chậm. Lưu ý tôi yêu cầu một giải pháp thanh lịch và nhanh chóng, không phải là một giải pháp đơn giản! Không biết bạn có thể làm một zinterstore trực tiếp với một bộ và một tập hợp được sắp xếp mặc dù. Cảm ơn câu trả lời của bạn và xin lỗi vì rõ ràng đã chọn tiêu đề xấu ... – user562529

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