2012-03-28 50 views
6

Tôi đã tự hỏi liệu có ai có thể đưa ra một số gợi ý về cách tạo thế hệ tập hợp được sắp xếp hiệu quả hơn không?Redis: Loại trừ các giá trị từ tập hợp được sắp xếp dựa trên giá trị trường băm

Tôi đang làm việc trên một dự án nơi dữ liệu xếp hạng được tính theo giờ và được lưu trữ trong cơ sở dữ liệu. Dữ liệu có thể được lọc theo giới tính thành viên, quốc gia, vv Có khoảng 2 triệu hàng cần được xử lý và phải mất một thời gian dài.

Chúng tôi muốn chuyển sang phương pháp tiếp cận thời gian thực hơn nơi dữ liệu được lưu trữ/sắp xếp/lọc trong Redis và xây dựng lại hàng ngày.

Trong nguyên mẫu, tôi đang tạo bộ sắp xếp cho từng tổ hợp có thể có của bộ lọc, ví dụ: leaderboard.au.male, leaderboard.au.female, v.v. Tôi đã viết kịch bản quy trình này nhưng một khi bạn xử lý mọi trường hợp, điều đó có nghĩa là có 118 bộ sắp xếp được tạo.

Lý tưởng nhất, tôi muốn có một bộ xếp hạng và bộ băm xếp hạng duy nhất cho mỗi thành viên chứa tên, giới tính và quốc gia của họ. Sau đó, sử dụng Redis chỉ trả về các giá trị được thiết lập đã sắp xếp dựa trên các bộ lọc do người dùng xác định. (ví dụ: chỉ nhận được thứ hạng cho nam giới từ Úc).

Điều này có thể thực hiện được trong Redis không?

Trả lời

4

tôi đề nghị bạn giữ một bộ với bảng xếp hạng cho tất cả các thành viên:

leaderboard = { id1: score1, id2: score2, ... } 

Và một tập đối với từng loại (giới tính, nước vv):

members.male = { id1, id2, ... } 
members.au = { id2, id3, ... } 

Sau đó, bạn làm một ZINTERSTORE :

zinterstore leaderboard.male 2 leaderboard members.male 

Hoặc để có bảng thành tích nam AU:

zinterstore leaderboard.au.male 3 leaderboard members.male members.au 

Bạn có thể kiểm soát cách tính điểm cho tập hợp được sắp xếp kết quả sẽ được tính bằng cách sử dụng WEIGHTSAGGREGATE.

Nếu bạn không muốn giữ bộ kết quả lâu dài, bạn có thể EXPIRE chúng và chỉ tạo bộ mới nếu không tồn tại.

+0

Cảm ơn, đây có vẻ là giải pháp linh hoạt nhất. –

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