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