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ā)生精度丟失。