1 常見排行榜
排行榜主要分為兩種励背,一種是并列排行榜(存在相同排名的情況)春霍,一種是嚴(yán)格排行榜(分先后順序,不存在并列名次)叶眉。
一般根據(jù)不同的業(yè)務(wù)場(chǎng)景址儒,選用不同的排行榜。例如竟闪,對(duì)于存在實(shí)物獎(jiǎng)勵(lì)且前一名與后一名的獎(jiǎng)品差距很大時(shí)离福,往往采用嚴(yán)格排行榜杖狼,而對(duì)于只是激勵(lì)用戶的場(chǎng)景炼蛤,則選用并列排行榜。
2 Redis嚴(yán)格排行榜實(shí)現(xiàn)
(1)數(shù)據(jù)結(jié)構(gòu):利用Redis的有序數(shù)列集合(zset)實(shí)現(xiàn)蝶涩。
(2)實(shí)現(xiàn)原理:
有序集合由三部分組成理朋,KEY(鍵)、score(成員的得分)绿聘、member(成員)嗽上。有序集合的每一項(xiàng),都是以鍵值對(duì)的形式存儲(chǔ)熄攘,每一項(xiàng)都有一個(gè)分?jǐn)?shù)兽愤。有序集合會(huì)根據(jù)score自動(dòng)排序。利用這個(gè)特性挪圾,我們就可以實(shí)現(xiàn)排行榜了浅萧。
score 是數(shù)字類型,可以是整形也可以是浮點(diǎn)型哲思。按照排行榜多級(jí)排序的要求洼畅,相同分值下按照先來后到的順序排序(創(chuàng)建時(shí)間越早,排序越高)棚赔,但是Redis相同分值帝簇,是按照 member 的 ASCII碼進(jìn)行排序徘郭。
所以,需要將 score進(jìn)行改造丧肴,同時(shí)記錄得分與時(shí)間信息残揉。實(shí)現(xiàn)方式有兩種:
方式一,score 為整數(shù)芋浮,采用“得分 + 時(shí)間差”格式冲甘,比如:10 + (1534694400 - 1534649521) = 44889
方式二,score 為浮點(diǎn)數(shù)途样,采用“整數(shù)部分使用得分江醇,小數(shù)部分使用時(shí)間差(截止時(shí)間減去創(chuàng)建時(shí)間)”格式。比如:10.44879
一般建議用第二種方式何暇,因?yàn)樘找梗?dāng)需求不僅需要排序,還需展示得分時(shí)裆站,可以將 score 強(qiáng)制轉(zhuǎn)化成整形条辟,即可獲取到得分。需要注意的是宏胯,得分最好不要太大羽嫡, score得分盡量控制在16位以下(浮點(diǎn)數(shù)時(shí),小數(shù)點(diǎn)前后位數(shù)和不要超過16位肩袍,最好15位)杭棵。超過16位后,score值存入redis氛赐,會(huì)發(fā)生精度丟失魂爪。