微博熱門的排序演算法

來源:互聯網
上載者:User
我有一張微博表,表裡記錄了點贊、轉寄、評論的數值,現在想最佳化熱門的排序演算法。

Q:熱門數值的儲存:以前我是在微博表中有一個欄位 _hot 表示熱度,每隔 60 分鐘 UPDATE 這個欄位,這樣排序的時候就直接按照_hot欄位排序就可以獲得。這樣能在一定程度上實現時間衰減。
更新的演算法也可以和大家分享:

UPDATE microblog as v SET _hot = LOG10((_zan*2+_com*5+ _tran*3))+(unix_timestamp(v._createtime)-unix_timestamp(\'2008-12-01 00:00:00\'))/100000;

問題也很明顯:
每隔 60s 就對於一張 4W+ 記錄的表的每條記錄做複雜的計算,對CPU的消耗太大。

A:我自己想實現的解決辦法是將資料 SELECT 出來,將計算放在代碼裡面,然後再 UPDATE 回去。

不知道有沒有更好的方式?如果用我的方式怎麼實現呢?

回複內容:

我有一張微博表,表裡記錄了點贊、轉寄、評論的數值,現在想最佳化熱門的排序演算法。

Q:熱門數值的儲存:以前我是在微博表中有一個欄位 _hot 表示熱度,每隔 60 分鐘 UPDATE 這個欄位,這樣排序的時候就直接按照_hot欄位排序就可以獲得。這樣能在一定程度上實現時間衰減。
更新的演算法也可以和大家分享:

UPDATE microblog as v SET _hot = LOG10((_zan*2+_com*5+ _tran*3))+(unix_timestamp(v._createtime)-unix_timestamp(\'2008-12-01 00:00:00\'))/100000;

問題也很明顯:
每隔 60s 就對於一張 4W+ 記錄的表的每條記錄做複雜的計算,對CPU的消耗太大。

A:我自己想實現的解決辦法是將資料 SELECT 出來,將計算放在代碼裡面,然後再 UPDATE 回去。

不知道有沒有更好的方式?如果用我的方式怎麼實現呢?

結論:

把密集的運算稀釋掉,充分用好閒置效能。

廢話:

首先,你的演算法本身就可以優化。完全可以轉而計算 x*10^y 其中 x = _zan2+_com*5+ _tran*3,y = unix_timestamp(v._createtime)/100000

當然,我覺得 100000 應該改成 604800 (也就是 7 * 24 * 60 * 60) ,或者把 10 改成 2,考慮「半衰期」更方便。

那麼假設你接受了我的建議,使用 x*2^y 表示。等等這個式子不眼熟嘛,這不就是浮點數的形式嘛。。。當然還需要調整好 x 的區間。 這時只要另 x 屬於 [1, 10) 即可(實際操作時,只需要取前幾位,然後將位數加上去即可)。多餘/不夠的部分加/減到 y 裏去。

於是乎,浮點數怎麼比大小,你就怎麼排序。壓根就不需要計算 x*2^y 到底是多少。

首先正負的問題就不用考慮了,然後是指數的二進位標記法更大的其浮點數值更大,也就是 y 更大的。

y 一樣再比較 x。(注意這裏的 x y 已經不是一開始的了)。

當然,又因爲,原本的 y 足夠大時,x 對其影響可忽略,所以,早於一定時間的微博根本不用考慮。

於是乎,你唯一必須知道的,就是 x 和 y。y 不合條件根本不考慮 x。y 符合條件再把 x 的位數(在二進製表示下)加上去。比較 y,y 相等才精確計算 x 並比較 x。(也就是說,一開始,對 x 的計算只用精確到它有多少位。。。根本不需知道精確值)。

所以現在必須知道的只剩下 y,以及一部分 x 的位數,以及個別 x 的精確值。

那麼怎樣快速計算 x 的位數?先睡一覺再告訴你。

算了,其實完全沒必要考慮 x 位數的速算,因爲計算 x 已經很簡單很簡單了。。。你只需要在用戶點讚、評論、轉發的時候,更新一下 x 就行了。哎,順便更新一下 y 也不錯嘛。。。其實根本不用儲存 x 嘛,只需要儲存一個 y + (x 的位數) 就行了。用到 x 的精確值可能性很低,到時候再說吧。。。

等等,其實以上一大堆全都可以刪掉了。

你只要在 _hot 可能更新的時候,更新一下就好了。把密集的運算稀釋掉,充分用好閒置效能。雖然浪費,但是卻避開了鋒芒。

所以不如延遲更新一下?每到距離上一次更新超過 60s,就再更新一次。或者,乾脆把計算 _hot 的任務交給客戶端 js,來個分佈式計算?爲保險起見,在上榜前再計算一次榜上有名的。

前一段時間記得有一個討論熱門演算法的文章,如果資料量非常大的話,直接進行排序等操作是不合適的,

可以考慮建一個表儲存熱門資料,每次從主表中擷取資料時,更新主表訪問數量,同時將擷取的資料和熱門資料表中最小值進行比較,小於則不做操作,大於則對熱門表進行插入排序

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.