2012-01-27 90 views
3

我在我的django網頁應用中實現了一個排行榜,但並不知道最好的方法。目前,我只是用SQL命令我的用戶,從,做一個排行榜,但是,這產生了兩個主要問題:網頁排行榜

  1. 性能是令人震驚的。我只嘗試將其擴展到幾百個用戶,但我可以告訴計算排名是緩慢的,過度緩存令人討厭,因爲我需要用戶在添加到排行榜後看到他們的排名。

  2. 幾乎不可能告訴用戶他們是什麼位置,而無需再次執行整個排行榜計算。

我還沒有部署,但我估計排行榜的排行榜大約有5%的更新與95%的閱讀(可能更多,實際上)。所以我最近的想法是每次添加用戶時都要重新計算排行榜,並且可以輕鬆地排序位置字段,而無需重新計算以顯示用戶的排名。

但是,如果多個用戶在同一時間提交,鎖定是否足夠或將排名填滿了,這可能是一個問題嗎?此外,我打算將這個單獨的數據庫專門用於這些排行榜,這是最好的?我聽到有關redis的好消息...

有沒有更好的方法來解決這個問題? (誰知道SO如何製作他們的排行榜?)

回答

1

您將會體會到Redis中sorted sets的概念。

不要錯過這說明問題的段落:d

+0

謝謝,我讀了更多關於Redis的內容,更多的是我認識到它對我的問題似乎已經得到完美的調整:P。 – paddymelon 2012-01-29 09:30:42

1

製作一張存儲用戶ID和用戶得分的表格。只需拉動排行榜使用

ORDER BY user_score DESC 

並加入主表的用戶名或任何你需要的。

除非測試的總數是您公式中的變量,否則排名系統的計算應該保持不變,因此只更新單個條目。

+0

謝謝,但這就是我目前正在做的事情,並不是太好玩。主要是a)當你想要抓住500-550的地方時,速度太慢,因爲你需要每次都按順序重新計算b)非常討厭抓住用戶的排名(意味着整個事情必須再次訂購) – paddymelon 2012-01-28 12:44:04

2

我已經寫了一些排行榜庫,這將有助於你在那裏。立即使用的是python-leaderboard,它基於參考實現leaderboard ruby gem。使用Redis排序集,您的排行榜將實時排名,並且排行榜頁面上的特定部分就性能指標而言,可以將大量成員同時插入排行榜。如果您正在流水作業,您可以預計在大約30秒內對100萬名成員進行排名。

如果您擔心實時更改數據的頻率過高,您可以在主從配置下操作Redis,並讓排行榜從從屬服務器獲取數據,這樣只會定期從主服務器進行輪詢。

希望這會有所幫助!