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