通過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中的排名。 |
命令示例 | 命令示例:
返回示例:
|