通過TairZset(exZset)可實現256維度double類型的分值排序,適用於遊戲、直播、音樂、電商等行業的熱門排行榜情境,可極大提升資料處理效率,且用戶端適配簡易,無需任何編解碼封裝。
TairZset簡介
原生Redis支援的排序結構Sorted Set(也稱Zset)只支援1個double類型的分值排序,實現多維度排序時較為困難。例如通過IEEE 754結合拼接的方式實現多維度排序,此類方式存在實現複雜、精度下降、EXZINCRBY命令無法使用等局限性。
藉助阿里雲自研的TairZset資料結構,可協助您輕鬆實現多維度排序能力,相較於傳統方案具有如下優勢:
最大支援256維的double類型的分值排序(排序優先順序為從左往右)。
對於多維score而言,左邊的score優先順序大於右邊的score,以一個三維score為例:score1#score2#score3,TairZset在比較時,會先比較score1,只有score1相等時才會比較score2,否則就以score1的比較結果作為整個score的比較結果。同樣,只有當score2相等時才會比較score3。若所有維度分數都相同,則會按照元素順序(ascii順序)進行排序。
為了方便理解,可以把#想象成小數點(.),例如0#99、99#90和99#99大小關係可以理解為0.99 < 99.90 < 99.99,即0#99 < 99#90 < 99#99。
支援EXZINCRBY命令,不再需要取回當前資料,在本地增加值後再拼接寫回Tair。
支援和原生Zset相似的API。
提供 普通熱門排行榜 和 分布式架構熱門排行榜 的能力。
提供開源TairJedis用戶端,無需任何編解碼封裝,您也可以參考開源自行實現封裝其他語言版本。
典型情境
適用於遊戲、直播、音樂、電商等行業的熱門排行榜情境,例如:
直播熱門排行榜:直播PK中,主播之間先按照當前人氣值排序;如果人氣值相同,再按照點贊數排序;如果點贊數也相同,再按照禮物金額進行排序等。
獎牌熱門排行榜:從金、銀、銅牌的維度對參賽方進行排名,先按照金牌數量排序;如果金牌數量一致,再以銀牌數量排序;如果銀牌數量也一致,再按照銅牌數量排序。
遊戲熱門排行榜:玩家之間按照得分、任務完成時間長度、段位等多個維度進行排名。
該Module已開源,更多資訊請參見TairZset。
最佳實務
前提條件
注意事項
操作對象為Tair執行個體中的TairZset資料。
命令列表
命令 | 文法 | 說明 |
| 將指定的分數與成員資訊儲存到TairZset結構的Key中,支援指定多個分數與成員。 說明 如需實現多維度排序,各維度分數之間使用井號(#)分隔,例如 | |
| 為Key(TairZset資料結構)中的成員增加分數,increment為要增加的分數值。 | |
| 返回儲存在Key(TairZset資料結構)中成員的分數,如果Key或Key中的成員不存在,系統會返回nil。 | |
| 返回儲存在Key(TairZset資料結構)中指定範圍的元素。 | |
| 返回儲存在Key(TairZset資料結構)中指定範圍內的元素,元素按分值從高到低的順序排列,按字典序降序排列分數相同的元素。 說明 除排序方式相反外,本命令和EXZRANGE用法相似。 | |
| 返回儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的所有元素,返回元素按分數從低到高排列,分數相同的元素按照字典順序返回。 | |
| 返回儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的所有元素。和TairZset中元素預設排序相反,該命令返回元素按照分數從高到低排列,分數相同的元素按照逆字典序排列。 說明 除排序方式相反外,本命令和EXZRANGEBYSCORE用法相似,注意本命令中max在前。 | |
| 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令返回儲存在Key中介於min和max值之間的元素。 | |
| 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令返回儲存在Key中介於max和min之間的元素。 說明 除排序方式相反外,本命令和EXZRANGEBYLEX用法相同,注意本命令中max在前。 | |
| 移除儲存Key中的指定成員,如果指定成員不存在,則忽略。 | |
| 移除儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的元素。 | |
| 移除儲存在Key(TairZset資料結構)中,層級介於start和stop之間的元素。 | |
| 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令移除儲存在Key中介於max和min之間的元素。 說明 若使用相同的min和max參數值執行該命令和EXZRANGEBYLEX命令,則該命令移除的元素與EXZRANGEBYLEX命令返回的元素相同。 | |
| 返回儲存在Key(TairZset資料結構)中的基數(即元素的個數)。 | |
| 返回儲存在Key(TairZset資料結構)中的成員的層級,按照分數由低到高排列。 層級(或索引)從0開始計數,即分數最低的成員的層級為0。 | |
| 返回儲存在Key(TairZset資料結構)中的成員的層級。返回結果按照分數從高到低排列。 層級(或索引)從0開始計數,即分數最高的成員的層級為0。 說明 除定序相反外,本命令和EXZRANK用法類似。 | |
| 返回儲存在Key(TairZset資料結構)中,分數介於min和max之間的元素的個數。 | |
| 為確保元素按照字典序排列,若Key中所有元素分數相同,則該命令返回儲存在Key,值介於min和max之間的元素的數量。 | |
| 計算指定的分數在Key(TairZset資料結構)中按照分數從低到高排序的排名位置。層級(或索引)從0開始計數,即分數最低的成員的層級為0。 說明 若指定的分數不存在,則返回該分數在Key(TairZset資料結構)中的預計排名;若指定的分數已存在,Tair會預設將指定的分數排在已存在的分數之前。 | |
| 計算指定的分數在Key(TairZset資料結構)中按照分數從高到低排序的排名位置。層級(或索引)從0開始計數,即分數最高的成員的層級為0。 說明 若指定的分數不存在,則返回該分數在Key(TairZset資料結構)中的預計排名;若指定的分數已存在,Tair會預設將指定的分數排在已存在的分數之後。 | |
| 使用原生Redis的DEL命令可以刪除一條或多條TairZset資料。 |
大寫關鍵字
:命令關鍵字。斜體
:變數。[options]
:選擇性參數,不在括弧中的參數為必選。A|B
:該組參數互斥,請進行二選一或多選一。...
:前面的內容可重複。
EXZADD
類別 | 說明 |
文法 |
|
時間複雜度 | O(N) |
命令描述 | 將指定的分數與成員資訊儲存到TairZset結構的Key中,支援指定多個分數與成員,系統會根據Key和成員是否存在,執行不同的策略: 說明 如需實現多維度排序,各維度分數之間使用井號(#)分隔,例如
|
選項 |
|
傳回值 | 傳回值為整數數字,具體為:
|
樣本 | 命令樣本:
返回樣本:
|
EXZINCRBY
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)) |
命令描述 | 為Key(TairZset資料結構)中的成員增加分數,increment為要增加的分數值,系統會根據Key和成員是否存在,執行不同的策略:
說明
|
選項 | 無 |
傳回值 | 返回成員的新分數(字串形式),如果使用了多維度分數,則該成員分數的格式為 |
樣本 | 命令樣本:
返回樣本:
|
EXZSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 返回儲存在Key(TairZset資料結構)中成員的分數,如果Key或Key中的成員不存在,系統會返回nil。 |
選項 | 無 |
傳回值 | 返回成員的分數(字串形式),如果使用了多維度分數,則該成員分數的格式為 |
樣本 | 命令樣本:
返回樣本:
|
EXZRANGE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 |
命令描述 | 返回儲存在Key(TairZset資料結構)中指定範圍的元素。 |
選項 |
|
傳回值 | 返回指定範圍內元素的列表,如果使用了WITHSCORES選項,則返回結果中包含元素的分數。 |
樣本 | 命令樣本:
返回樣本:
|
EXZREVRANGE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 |
命令描述 | 返回儲存在Key(TairZset資料結構)中指定範圍內的元素,元素按分值從高到低的順序排列,按字典序降序排列分數相同的元素。 說明 除排序方式相反外,本命令和EXZRANGE用法相似。 |
選項 |
|
傳回值 | 返回指定範圍內的元素列表,如果使用了WITHSCORES選項,則返回結果中包含元素的分數。 |
樣本 | 命令樣本:
返回樣本:
|
EXZRANGEBYSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 說明 當M為常量時(例如使用LIMIT選項指定總是返回前10個元素時),可將該公式看作O(log(N))。 |
命令描述 | 返回儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的所有元素,返回元素按分數從低到高排列,分數相同的元素按照字典順序返回。 |
選項 |
|
傳回值 | 返回指定分數範圍內的元素列表,如果使用了WITHSCORES選項,則返回結果中包含元素的分數。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREVRANGEBYSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M) ,其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 說明 當M為常量時(比如使用LIMIT選項指定總是返回前10個元素時),可將該公式看作O(log(N))。 |
命令描述 | 返回儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的所有元素。和TairZset中元素預設排序相反,該命令返回元素按照分數從高到低排列,分數相同的元素按照逆字典序排列。 說明 除排序方式相反以外,本命令和EXZRANGEBYSCORE用法相似,注意本命令中max在前。 |
選項 |
|
傳回值 | 返回指定分數範圍內的元素列表,如果使用了WITHSCORES選項,則返回結果中包含元素的分數。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZRANGEBYLEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 說明 當M為常量時(例如使用LIMIT選項指定返回前10個元素時),可將該公式看作O(log(N))。 |
命令描述 | 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令返回儲存在Key中介於min和max值之間的元素。 說明
|
選項 |
|
傳回值 | 返回元素名稱在指定範圍內的元素列表。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREVRANGEBYLEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N表示TairZset中元素的數量,M表示返回的元素的數量。 說明 當M為常量時(例如使用LIMIT選項指定總是返回前10個元素時),可將該公式看作O(log(N))。 |
命令描述 | 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令返回儲存在Key中介於max和min之間的元素。 說明 除排序方式相反外,本命令和EXZRANGEBYLEX用法相同,注意本命令中max在前。 |
選項 |
|
傳回值 | 返回元素名稱在指定範圍內的元素列表。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREM
類別 | 說明 |
文法 |
|
時間複雜度 | O(M*log(N)),其中,N為TairZset中元素的數量,M為待移除的元素的數量。 |
命令描述 | 移除儲存Key中的指定成員,如果指定成員不存在,則忽略。 說明 如果指定的Key存在,但其資料結構不是TairZset,系統將返回錯誤。 |
選項 | 無 |
傳回值 | 返回Key中被移除的成員數量,不包含不存在的成員。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREMRANGEBYSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N為TairZset中元素的數量,M為待移除的元素的數量。 |
命令描述 | 移除儲存在Key(TairZset資料結構)中,分數大於等於min且小於等於max值的元素。 |
選項 | min和max分別表示最小分數和最大分數,如Key中的元素採用了多維度分數,各維度分數之間使用井號(#)分隔。 說明
|
傳回值 | 返回被移除的元素的數量。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREMRANGEBYRANK
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N為TairZset中元素的數量,M為該操作移除的元素的數量。 |
命令描述 | 移除儲存在Key(TairZset資料結構)中,層級介於start和stop之間的元素。 |
選項 | start和stop均為基於零的索引值,其中,0代表分數最低的元素。 當索引值為負數,代表從最高分數元素開始的位移量,例如-1為分數最高的元素,-2為分數第二高的元素,依此類推。 |
傳回值 | 被移除的元素的數量。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREMRANGEBYLEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)+M),其中,N為TairZset中元素的數量,M為該操作移除的元素的數量。 |
命令描述 | 為確保元素按照字典序排列,當Key中所有元素分數相同時,則該命令移除儲存在Key中介於max和min之間的元素。 說明 若使用相同的min和max參數值執行該命令和EXZRANGEBYLEX命令,則該命令移除的元素與EXZRANGEBYLEX命令返回的元素相同。 |
選項 | min、max:分別表示成員名稱的最小值和最大值(字串形式),需指定字元的區間,例如
|
傳回值 | 被移除的元素的數量。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZCARD
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 返回儲存在Key(TairZset資料結構)中的基數(即元素的個數)。 |
選項 | 無 |
傳回值 | 返回Key中的元素的數量,如果Key不存在,則返回0。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZRANK
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)) |
命令描述 | 返回儲存在Key(TairZset資料結構)中的成員的層級,按照分數由低到高排列。 層級(或索引)從0開始計數,即分數最低的成員的層級為0。 |
選項 | 無 |
傳回值 |
|
命令樣本 | 命令樣本:
返回樣本:
|
EXZREVRANK
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)) |
命令描述 | 返回儲存在Key(TairZset資料結構)中的成員的層級。返回結果按照分數從高到低排列。 層級(或索引)從0開始計數,即分數最高的成員的層級為0。 說明 除定序相反外,本命令和EXZRANK用法類似。 |
選項 | 無 |
傳回值 |
|
命令樣本 | 命令樣本:
返回樣本:
|
EXZCOUNT
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)),其中,N為TairZset中元素的數量。 說明 由於採用了元素層級擷取查詢範圍,該操作涉及的工作量和查詢範圍的大小即不成正比。 |
命令描述 | 返回儲存在Key(TairZset資料結構)中,分數介於min和max之間的元素的個數。 |
選項 | min、max:分別表示最小分數和最大分數,如Key中的元素採用了多維度分數,各維度分數之間使用井號(#)分隔。 說明
|
傳回值 | 返回分數在指定範圍內的元素的數量(整數)。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZLEXCOUNT
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)),其中,N為TairZset中元素的數量。 說明 由於採用了元素層級擷取查詢範圍,該操作涉及的工作量和查詢範圍的大小即不成正比。 |
命令描述 | 為確保元素按照字典序排列,若Key中所有元素分數相同,則該命令返回儲存在Key,值介於min和max之間的元素的數量。 說明
|
選項 | min、max:分別表示成員名稱的最小值和最大值(字串形式),需指定字元的區間,例如
|
傳回值 | 返回分數在指定範圍內的元素的個數(整數)。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZRANKBYSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)) |
命令描述 | 計算指定的分數在Key(TairZset資料結構)中按照分數從低到高排序的排名位置。層級(或索引)從0開始計數,即分數最低的成員的層級為0。 說明 若指定的分數不存在,則返回該分數在Key(TairZset資料結構)中的預計排名;若指定的分數已存在,Tair會預設將指定的分數排在已存在的分數之前。 |
選項 | 無 |
傳回值 | 返回指定分數在Key中的排名。 |
命令樣本 | 命令樣本:
返回樣本:
|
EXZREVRANKBYSCORE
類別 | 說明 |
文法 |
|
時間複雜度 | O(log(N)) |
命令描述 | 計算指定的分數在Key(TairZset資料結構)中按照分數從高到低排序的排名位置。層級(或索引)從0開始計數,即分數最高的成員的層級為0。 說明 若指定的分數不存在,則返回該分數在Key(TairZset資料結構)中的預計排名;若指定的分數已存在,Tair會預設將指定的分數排在已存在的分數之後。 |
選項 | 無 |
傳回值 | 返回指定分數在Key中的排名。 |
命令樣本 | 命令樣本:
返回樣本:
|