?
This document uses PHP Chinese website manual Release
SRANDMEMBER key [count]
自1.0.0起可用。
時(shí)間復(fù)雜度:沒有計(jì)數(shù)參數(shù)O(1),否則O(N)其中N是通過的計(jì)數(shù)的絕對值。
當(dāng)僅用key
參數(shù)調(diào)用時(shí),從存儲(chǔ)在的設(shè)置值返回一個(gè)隨機(jī)元素key
。
從 Redis 版本2.6開始,當(dāng)使用附加count
參數(shù)調(diào)用時(shí),如果為正值,則返回count
不同元素的數(shù)組count
。如果調(diào)用負(fù)值,count
則行為會(huì)發(fā)生更改,并且該命令可以多次返回相同的元素。在這種情況下,返回元素的數(shù)量是指定的絕對值count
。
當(dāng)僅用關(guān)鍵參數(shù)調(diào)用時(shí),操作與 SPOP 類似,但 SPOP 也會(huì)從集合中刪除隨機(jī)選擇的元素,SRANDMEMBER 將只返回一個(gè)隨機(jī)元素而不以任何方式更改原始集合。
散裝串答復(fù):沒有附加count
參數(shù)中的命令返回與所述隨機(jī)選擇的元件的散裝回復(fù),或nil
當(dāng)key
不存在。數(shù)組回復(fù):當(dāng)count
傳遞附加參數(shù)時(shí),該命令返回一個(gè)元素?cái)?shù)組,或者當(dāng)一個(gè)空數(shù)組key
不存在時(shí)。
redis> SADD myset one two three (integer) 3
redis> SRANDMEMBER myset "three"
redis> SRANDMEMBER myset 2 1) "two" 2) "three"
redis> SRANDMEMBER myset -5 1) "one" 2) "one" 3) "one" 4) "two" 5) "two"
當(dāng)一個(gè) count 參數(shù)被傳遞并且是肯定的時(shí)候,這些元素被返回,就好像每個(gè)被選中的元素都被從集合中移除一樣(比如提取賓果游戲中的數(shù)字)。但是元素不會(huì)從 Set 中刪除。所以基本上:
沒有重復(fù)的元素被返回。
如果 count 大于 Set 內(nèi)部的元素?cái)?shù)量,則該命令將只返回整個(gè)集合而不包含其他元素。
如果計(jì)數(shù)是負(fù)數(shù),則行為會(huì)發(fā)生變化,并且提取會(huì)發(fā)生,就好像在每次提取后再次將提取的元素放入包中一樣,因此可能會(huì)重復(fù)元素,并且總是會(huì)返回請求的元素?cái)?shù)量,因?yàn)槲覀兛梢灾貜?fù)相同的元素元素一次又一次,除了一個(gè)空的 Set(不存在的鍵),它總是會(huì)產(chǎn)生一個(gè)空數(shù)組。
當(dāng)集合中的元素?cái)?shù)量很少時(shí),返回元素的分布還遠(yuǎn)未完善,這是因?yàn)槲覀兪褂昧艘粋€(gè)近似的隨機(jī)元素函數(shù),并不能真正保證良好的分布。
使用的算法在 dict.c 中實(shí)現(xiàn),對哈希表桶進(jìn)行采樣以找到非空的桶。一旦找到一個(gè)非空的桶,因?yàn)槲覀冊谖覀兊墓1韺?shí)現(xiàn)中使用鏈接,所以會(huì)檢查桶內(nèi)的元素?cái)?shù)量并選擇一個(gè)隨機(jī)元素。
這意味著如果在整個(gè)散列表中有兩個(gè)非空桶,并且一個(gè)有三個(gè)元素,而另一個(gè)只有一個(gè),那么在桶中單獨(dú)存在的元素將返回的概率要高得多。