Redis+Hacker news算法開發(fā)基于用戶投票的搜索熱度排名

排名在web開發(fā)中序无,屬于基礎(chǔ)功能,以方便用戶從大量信息之中衡创,快速有效地找出最重要的內(nèi)容帝嗡,從最基礎(chǔ)的用戶的點(diǎn)擊數(shù)進(jìn)行排行,到互聯(lián)網(wǎng)大廠基于人工智能的熱度算法都在此范圍內(nèi)璃氢。

熱度排名

排名可以基于信息本身的特征哟玷,也可以基于用戶的投票,即讓用戶決定一也,而熱度是基于用戶投票機(jī)制巢寡,輔以不同的算法完成排名。

Delicious算法

最直覺椰苟、最簡(jiǎn)單的算法抑月,按照單位時(shí)間內(nèi)用戶的投票數(shù)進(jìn)行排名
如按照"過(guò)去一定時(shí)間內(nèi)被點(diǎn)擊的次數(shù)"進(jìn)行排名。每過(guò)一定時(shí)間舆蝴,就統(tǒng)計(jì)一次谦絮。

這個(gè)算法的優(yōu)點(diǎn)是比較簡(jiǎn)單、容易部署洁仗、內(nèi)容更新相當(dāng)快层皱;缺點(diǎn)是,一方面赠潦,排名變化不夠平滑叫胖,前一個(gè)小時(shí)還排名靠前的內(nèi)容,往往第二個(gè)小時(shí)就一落千丈她奥,另一方面臭家,缺乏自動(dòng)淘汰舊項(xiàng)目的機(jī)制,某些熱門內(nèi)容可能會(huì)長(zhǎng)期占據(jù)排行榜前列方淤。

Hacker news算法

Hacker news算法是Hacker news在原版本中基于用戶投票機(jī)制排名熱帖的方法钉赁,其原始的數(shù)學(xué)公式為

score = P / (T)^G
P為帖子得票數(shù) T為距離發(fā)帖時(shí)的時(shí)間差  G為“重力因子”用于控制時(shí)間對(duì)熱度排名的影響
 (T)^G  T的G次方

(P-1) / (T+2)^G
Hacker news將G默認(rèn)為1.8 P-1以減去發(fā)帖人的點(diǎn)擊數(shù),T+2以緩沖2小時(shí)內(nèi)的發(fā)帖熱度

我們?cè)诘弥烁鱾€(gè)參數(shù)的含義后可根據(jù)自己的具體業(yè)務(wù)進(jìn)行調(diào)參

Hacker News的Ranking算法主要區(qū)別在于引入了T P G這些參數(shù)携茂,這參數(shù)是不斷變化的你踩,從而導(dǎo)致一篇帖子的得分不斷變化。擁有自動(dòng)淘汰舊項(xiàng)目的機(jī)制,排名曲線相對(duì)平滑带膜,在中小站是在復(fù)雜度與功能性的取舍中較優(yōu)選擇吩谦。

結(jié)合Reids實(shí)現(xiàn)Hacker news

因?yàn)閞edis作為緩存數(shù)據(jù)庫(kù)數(shù)據(jù)讀取快,對(duì)網(wǎng)站性能影響較小膝藕,且redis擁有zset這種可自動(dòng)排名的數(shù)據(jù)結(jié)構(gòu)式廷,也可對(duì)過(guò)期時(shí)間進(jìn)行控制以更簡(jiǎn)單的對(duì)數(shù)據(jù)進(jìn)行自動(dòng)的清理,所以選擇redis芭挽,完全使用mysql等數(shù)據(jù)庫(kù)也可完成此功能滑废。

Z-Set
/* 根據(jù)用戶行為進(jìn)行熱度投票
 * 使用hacker nwes  算法配合redis
 * (P-1) / (T+2)^G
 * p 投票數(shù)
 * t 發(fā)布日期
 * */
public boolean addSetData(JSONObject param){
    JSONObject result = new JSONObject();
    String key = param.getString("key");
    String name = param.getString("name");
    String behavior = param.getString("behavior");
    //獲取用戶行為判斷票數(shù)
    switch (behavior){
        case "click" :
            redisTemplate.opsForValue().increment(name);
            break;
        case "list" :
            redisTemplate.opsForValue().increment(name,2);
            break;
        case "collect" :
            redisTemplate.opsForValue().increment(name,10);
            break;
    }
  //進(jìn)行票數(shù)計(jì)算
    int P =   Integer.parseInt(redisTemplate.opsForValue().get(name).toString()) ;
    LocalDate now = LocalDate.now();
    LocalDate ReleaseDate = LocalDate.parse("2020-01-30");
    long timeDiff = now.toEpochDay()-ReleaseDate.toEpochDay();
    double score;
    score = P /  Math.pow(timeDiff,1.8);
    Boolean saveBool = redisTemplate.opsForZSet().add(key,name,score);
    return saveBool ;
}

在項(xiàng)目上線后,進(jìn)行數(shù)據(jù)記錄袜爪,分析數(shù)據(jù)情況對(duì)G 與T 票值P進(jìn)行優(yōu)化蠕趁,對(duì)incr的值的過(guò)期時(shí)間進(jìn)行調(diào)整,同時(shí)定期對(duì)ZSet內(nèi)的值進(jìn)行修正以及垃圾 數(shù)據(jù)的清刪辛馆。
最后俺陋,redis的穩(wěn)定性相較于mysql低,我們一般會(huì)在一定時(shí)間內(nèi)將redis備份至mysql數(shù)據(jù)庫(kù)昙篙,還可以通過(guò)mysql中的數(shù)據(jù)對(duì)算法進(jìn)行優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊状,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苔可,更是在濱河造成了極大的恐慌寿酌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕蛹,死亡現(xiàn)場(chǎng)離奇詭異醇疼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)法焰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門秧荆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人埃仪,你說(shuō)我怎么就攤上這事乙濒。” “怎么了卵蛉?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵颁股,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我傻丝,道長(zhǎng)甘有,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任葡缰,我火速辦了婚禮亏掀,結(jié)果婚禮上忱反,老公的妹妹穿的比我還像新娘。我一直安慰自己滤愕,他們只是感情好温算,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著间影,像睡著了一般注竿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魂贬,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天巩割,我揣著相機(jī)與錄音,去河邊找鬼随橘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锦庸,可吹牛的內(nèi)容都是我干的机蔗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甘萧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萝嘁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扬卷,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牙言,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后怪得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱枉,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年徒恋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕断。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡入挣,死狀恐怖亿乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情径筏,我是刑警寧澤葛假,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站滋恬,受9級(jí)特大地震影響聊训,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恢氯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一魔眨、第九天 我趴在偏房一處隱蔽的房頂上張望媳维。 院中可真熱鬧,春花似錦遏暴、人聲如沸侄刽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)州丹。三九已至,卻和暖如春杂彭,著一層夾襖步出監(jiān)牢的瞬間墓毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工亲怠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留所计,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓团秽,卻偏偏與公主長(zhǎng)得像主胧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子习勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容