?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
自1.0.5起可用。
時間復雜度: O( log(N)+ M),其中 N 是有序集合中元素的數(shù)量,M 是返回元素的數(shù)量。如果 M 是常量(例如,總是要求使用 LIMIT 的前10個元素),則可以將其視為O( log(N))。
在key中,min
與max
之間的分數(shù)返回排序集合中的所有元素(包括分數(shù)等于min
或max
的元素)。這些元素被認為是從低到高排序。
具有相同分數(shù)的元素按照字典順序返回(這是從 Redis 中的有序集合實現(xiàn)的屬性開始的,并且不涉及進一步的計算)。
可選LIMIT
參數(shù)可用于僅獲取匹配元素的范圍(與 SELECT LIMIT 偏移量類似,SQL 中的計數(shù)類似)。請記住,如果offset
很大,則需要offset
在獲取要返回的元素之前遍歷元素的排序集,這可能會增加 O(N)時間復雜度。
可選WITHSCORES
參數(shù)使命令返回元素及其分數(shù),而不是單獨的元素。該選項自 Redis 2.0 開始提供。
min
和max
可以是-inf
和+inf
,讓你不需要知道的有序集合最高或最低分數(shù)來自或達到一定的分數(shù)獲得的所有元素。
默認情況下,由min
和max
指定的間隔是關閉的(包括)??梢酝ㄟ^在字符前加上分數(shù)來指定開放間隔(獨占)(
。例如:
ZRANGEBYSCORE zset (1 5
將1 < score <= 5
返回所有元素,當在這個時候:
ZRANGEBYSCORE zset (5 (10
將返回5 < score < 10
的所有元素(排除5和10)。
陣列回復:指定分數(shù)范圍內(nèi)的元素列表(可選擇其分數(shù))。
redis> ZADD myzset 1 "one" (integer) 1
redis> ZADD myzset 2 "two" (integer) 1
redis> ZADD myzset 3 "three" (integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf 1) "one" 2) "two" 3) "three"
redis> ZRANGEBYSCORE myzset 1 2 1) "one" 2) "two"
redis> ZRANGEBYSCORE myzset (1 2 1) "two"
redis> ZRANGEBYSCORE myzset (1 (2 (empty list or set)
通常使用 ZRANGEBYSCORE 來獲得評分是索引整數(shù)鍵的項目范圍,但是可以使用該命令做較不明顯的事情。
例如,在實現(xiàn)馬爾可夫鏈和其他算法時常見的問題是從一個集合中隨機選擇一個元素,但是不同的元素可能有不同的權重,這會改變他們被挑選的可能性。
這就是我們?nèi)绾问褂眠@個命令來安裝這樣一個算法:
假設你有元素 A ,B 和 C ,權重為1,2和3。你計算權重的總和,即1 + 2 + 3 = 6
此時,您可以使用此算法將所有元素添加到排序集中:
SUM = ELEMENTS.TOTAL_WEIGHT // 6 in this case.SCORE = 0FOREACH ELE in ELEMENTS SCORE += ELE.weight / SUM ZADD KEY SCORE ELE END
這意味著你設置了:
A to score 0.16B to score .5C to score 1
由于這涉及近似值,為了避免 C 設置為0.998而不是1,我們只需修改上述算法以確保最后得分為1(對于讀者來說,這留給練習者...)。
在這一點上,每次你想得到一個加權隨機元素,只需計算一個介于0和1之間的隨機數(shù)(這就像rand()
在大多數(shù)語言中調(diào)用一樣),所以你可以這樣做:
RANDOM_ELE = ZRANGEBYSCORE key RAND() +inf LIMIT 0 1