天天看點

阿裡雲Redis典型場景:如何建構可擴充通用排行榜系統摘要背景排行榜特性排行算法通用排行榜系統架構總結

本文主要介紹通用排行榜的需求功能,并介紹了基于Redis的ZSET資料結構的排序方法,另外探讨了通用排行榜的架構及使用者如何通過阿裡雲Redis解決通用排行架構的技術問題。

移動網際網路時代的春風刮來了各種不同的業務場景,直播元年、短視訊元年、類微網誌資訊流、各種電商業務也在這個移動網際網路快車上集中爆發。在這些業務中資訊成為了各種場景的關鍵,而資訊的價值往往隐藏在各種排行中,對于一個直播大V可能關注直播人數的排行榜,因為他希望萃取他家長處;對于一個商家可能關注商品浏覽排行榜,因為他希望更好的區做店鋪引流;對于一個遊戲使用者他可能關注自己在某一個群組的排行榜,因為他希望他喜歡的人能關注到他名列前茅。以此我們希望在這個文章中探讨一個基于阿裡雲Redis的可擴充通用的排行榜系統建構的方法。

排行榜看起來簡單,實際上對于通用的排行榜系統具有很高的複雜度和系統能力要求。排行榜系統首先需要定義資料源,不同資料對于排行榜系統也有不同的能力要求,我們總結了一下排行榜的特點。

如果一個排行榜的結果關系到使用者的權益問題,這個時候一個排行榜的精确性就需要非常高,比如一個營運同學進行了根據微網誌轉發數量的營銷活動,這個時候微網誌轉發數量的排行榜就需要非常精确,否則會影響使用者權益的分發。

遊戲和社互動動的結合是目前的趨勢,對于熱門遊戲的排行是使用者的關注重點,在這部分使用者中對于排行的實時性有很高的要求,如果一個使用者更新了自己的裝備和能力,而自己的排名一直沒有更新,那這個使用者一定要非常傷心抛棄這個遊戲了。是以通過離線計算等平台來建構一個非實時的排行榜系統就不太适合這樣的模型。

在排行系統中有些使用者隻需要定期對資料進行更新即可,是以我們在排行榜系統中需要提供自定義的功能,讓使用者可以定義排序的周期,可以按照小時、日、周不同的周期對資料進行處理,使用者再進行簡單配置之後可以生成對應的排行榜單。

海量資料是目前的一個趨勢,比如對于淘寶全網商品的一個排行,這個榜單将會是一個億級别的,是以我們設計的榜單也需要具備彈性伸縮能力,同時在對海量資料進行排行的時候擁有一定的實時性。

在排行系統中我們選用Redis提供的ZSET作為基礎的資料結構,ZSET是一個有序的資料集合,在這個資料集合中使用者可以添加不同SCORE值的MEMBER,并且使用者可以通過接口對這些有序集合根據SCORE值進行排序。ZSET這樣的資料結構可以很友善的用于排行榜系統中。

假設我們需要對一個動物運動會的比賽成績做一個排序,我們先簡單的構造一個ZSET的KEY,并添加每種動物的成績。Redis指令如下:

添加完成每個商家的銷售額之後,我們可以調用Redis的zrange指令進行排序擷取指定排名的商家,Redis指令如下:

如下顯示了ZSET相關的指令使用方法

ZADD key score1 member1 [score2 member2]

添加一個或多個成員到有序集合,或者如果它已經存在更新其分數

ZCARD key

得到的有序集合成員的數量

ZCOUNT key min max

計算一個有序集合成員與給定值範圍内的分數

ZINCRBY key increment member

在有序集合增加成員的分數

ZINTERSTORE destination numkeys key [key …]

多重交叉排序集合,并存儲生成一個新的鍵有序集合。

ZLEXCOUNT key min max

計算一個給定的字典範圍之間的有序集合成員的數量

ZRANGE key start stop [WITHSCORES]

由索引傳回一個成員範圍的有序集合。

ZRANGEBYLEX key min max [LIMIT offset count]

傳回一個成員範圍的有序集合(由字典範圍)

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

按分數傳回一個成員範圍的有序集合。

ZRANK key member

确定成員的索引中有序集合

ZREM key member [member …]

從有序集合中删除一個或多個成員

ZREMRANGEBYLEX key min max

删除所有成員在給定的字典範圍之間的有序集合

ZREMRANGEBYRANK key start stop

在給定的索引之内删除所有成員的有序集合

ZREMRANGEBYSCORE key min max

在給定的分數之内删除所有成員的有序集合

ZREVRANGE key start stop [WITHSCORES]

傳回一個成員範圍的有序集合,通過索引,以分數排序,從高分到低分

ZREVRANGEBYSCORE key max min [WITHSCORES]

傳回一個成員範圍的有序集合,按分數,以分數排序從高分到低分

ZREVRANK key member

确定一個有序集合成員的索引,以分數排序,從高分到低分

ZSCORE key member

擷取給定成員相關聯的分數在一個有序集合

ZUNIONSTORE destination numkeys key [key …]

添加多個集排序,所得排序集合存儲在一個新的鍵

ZSCAN key cursor [MATCH pattern] [COUNT count]

增量疊代排序元素集和相關的分數

對于一個通用性的排行榜系統,我們需要對服務進行Qos保證,為了達到服務分級Qos保證的能力,我們引入MetaQ或者Kafka等元件進行資料的接入,整體系統功能如下。

對于排行榜系統每個系統存在存儲和計算兩個流程,原始資料的存儲可以選擇MYSQL進行存儲,計算排行階段選擇了阿裡雲Redis進行排行計算。阿裡雲Redis具有主從、叢集、讀寫分離、異地多活等形态的産品,我們可以随着業務的變化進行靈活的更改配置。整個排行版的資料流圖如下。

對于熱門排行的榜單可以選用阿裡雲Redis讀寫分離來解決單個榜單的讀問題。

對于海量榜單的需求可以選用阿裡雲Redis的叢集版本,阿裡雲Redis叢集版本的容量可以達到TB級别,并且可以輕松擴容,可以按照自願使用量進行彈性伸縮。

對于單元化的榜單,可以選用阿裡雲Redis的多中心方案,配置一個中心的寫入,多個中心的讀取,阿裡雲Redis提供的BLS服務可以輕松搭建兩個中心的同步通道。

繼續閱讀