2013-06-11 30 views
5

Tôi đang làm việc trên một trang web thông lượng rất cao với nhiều mục, đang xem xét chức năng loại "xu hướng hiện tại", cho phép người dùng nhanh chóng có được danh sách ưu tiên hàng đầu các mục đã được nhiều người xem gần đây, dần dần biến mất khi họ nhận được ít lượt xem hơn.Sử dụng Redis cho chức năng "xu hướng bây giờ"

Một ý tưởng về cách thực hiện điều này là tăng cân cho các mục gần đây của một mục, chẳng hạn như trọng lượng 16 cho mỗi lượt xem một mục trong 15 phút qua, trọng số là 8 cho mỗi lượt xem của một mục trong 1 giờ qua, trọng lượng 4 cho những thứ trong 4 giờ qua, v.v. nhưng tôi không biết đây có phải là cách đúng đắn để tiếp cận nó hay không.

Tôi muốn làm điều này trong Redis, chúng tôi đã thành công tốt với Redis trong quá khứ cho các dự án khác.

Cách tốt nhất để thực hiện điều này, cả về công nghệ lẫn xác định xu hướng là gì?

Câu trả lời đầu tiên gợi ý một giải pháp nhưng tôi đang tìm kiếm thêm chi tiết - bắt đầu một tiền thưởng.

Đây là cả hai ý tưởng phong nha, nhưng không đủ chi tiết. Một người nhận được một nửa số tiền thưởng nhưng để câu hỏi mở ra.

Trả lời

6

Vì vậy, tôi sẽ bắt đầu với một thứ tự thời gian cơ bản (ví dụ zset item_id được đánh dấu bằng dấu thời gian) và sau đó nổi lên dựa trên tương tác. Vì vậy, bạn có thể quyết định rằng một tương tác đơn lẻ đáng giá 10 phút 'mới mẻ', do đó, mỗi tương tác sẽ thêm nhiều thời gian vào điểm số của mục có liên quan. Nếu tất cả các tương tác có giá trị như nhau, bạn có thể làm điều này với một tập hợp zset và chỉ tăng điểm số khi tương tác xảy ra.

Nếu bạn muốn có một số loại trả lời, được tính bằng căn bậc hai của số lần tương tác thay vì số tương tác trực tiếp, bạn có thể tạo một tập hợp số thứ hai với điểm số của bạn cho tương tác và sử dụng zunionstore kết hợp điều này với chỉ mục dấu thời gian của bạn. Đối với điều này, có thể bạn sẽ muốn rút ra điểm số hiện tại, thực hiện một số toán học và đặt một số điểm mới lên nó (zadd sẽ cho phép bạn ghi đè điểm số)

ZUnstore rất đắt tiền và đủ lớn đặt ngay cả các zadd/kẽmrby được đắt tiền. Để kết thúc này, bạn có thể muốn chỉ giữ N mục ghi điểm cao nhất, cho N = 10.000 nói, tùy thuộc vào nhu cầu ứng dụng của bạn.

2

xem xét tập hợp đơn đặt hàng với số lượt xem làm điểm số. bất cứ khi nào một mục được truy cập, tăng điểm số của nó (http://redis.io/commands/zincrby). theo cách này, bạn có thể lấy các vật phẩm hàng đầu ra khỏi tập hợp được sắp xếp theo điểm số.

bạn cũng sẽ cần "phai" các mục, có thể với quy trình bên ngoài sẽ làm giảm điểm số.

+0

cảm ơn, sử dụng cách tiếp cận này, các mục sẽ trở nên ít "nóng" như thế nào? – OneSolitaryNoob

+0

Tôi đã cập nhật câu trả lời. – akonsu

+0

cảm ơn rất nhiều, ZINCRBY trông thực sự hữu ích.bất kỳ chi tiết nào khác về cấu trúc? những gì là tôi có thể mong đợi nhất để đặt trong bộ này? một vài triệu có quá nhiều không? là công việc cron "phai" tiếp cận một cách hợp lý để làm việc? – OneSolitaryNoob

4
+1

Liên kết chỉ đăng thường rủi ro; bạn đang bị treo nếu liên kết trở nên không hợp lệ. –

+0

Cảm ơn Bill. Tôi nhìn vào bàn quên. Có vẻ như nó không quy mô xa. Ví dụ này là một tập hợp được sắp xếp của ~ 260 quốc gia được đọc toàn bộ. Với chỉ 260 yếu tố đó là tốt, nhưng sẽ không làm việc với 10s của hàng triệu. Có thể có một cách để phân vùng dữ liệu của họ thành nhiều khóa Redis và sử dụng cách tiếp cận phân rã của chúng, nhưng, làm cho nó tẻ nhạt để tìm các mặt hàng "xu hướng hiện tại" hàng đầu. (và Bill là chính xác, các liên kết có thể đi cuối cùng cũ) – OneSolitaryNoob

+2

Hình như liên kết đầu tiên đã chết. Đây có phải là cùng một bài viết http://qwerjk.com/posts/surfacing-interesting-content không? – smilledge

3

Các Ranking thuật toán Reddit làm một công việc khá tốt về những gì bạn mô tả. Một tốt viết lên ở đây mà nói qua cách nó hoạt động.

https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9

+0

Liên kết này dường như trỏ đến máy chủ ngoại tuyến. Điều này có thể giúp (https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9) –

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