2016-04-29 28 views
1

當我們使用sadd在集合中插入成員時,是否存在確定性的方式來插入數據? 例如,smembers:如何決定放置順序?

127.0.0.1:6380> smembers test 
1) "hello world" 
2) "hello" 
3) "hello world 1234212" 
4) "hello world 123" 

127.0.0.1:6380> sadd test "aman" 
(integer) 1 

127.0.0.1:6380> smembers test 
1) "hello world" 
2) "hello" 
3) "hello world 1234212" 
4) "hello world 123" 
5) "aman" 

127.0.0.1:6380> sadd test "stack overflow" 
(integer) 1 
127.0.0.1:6380> smembers test 
1) "hello world 1234212" 
2) "hello world 123" 
3) "hello world" 
4) "aman" 
5) "stack overflow" 
6) "hello" 

如可以似乎,當我插入的「堆棧溢出」,「你好」被示出在最後一個索引,而不是索引2作爲在先前查詢。有沒有解釋這種行爲?

回答

1

集合使用散列表實現並且是確定性的。然而,這並不意味着您從SMEMBERS獲得的訂單就是您期望的。

如果您需要詞典排序,請使用排序集,其中所有成員都具有相同的分數(例如零)。

+0

你的意思是「不確定性」嗎?如果我在同一組成員中使用分子,它將始終以一個順序返回成員。所以,在增加一個新成員後,訂單可能會發生變化,事情正在改變,我正在試圖理解。 –

+0

我的意思是確定性 - 閱讀哈希表以瞭解它們如何工作,存儲桶衝突等等。然後,請記住,Redis對Hashes也有兩種不同的編碼(取決於大小和配置指令,可以使用一種或另一種)。 –

0

如果你想要一個有序集合,你應該使用ZADD新增的項目,並ZRANGE從集檢索它們:

127.0.0.1:6379> zadd sorted 1 "z" 
(integer) 1 
127.0.0.1:6379> zadd sorted 1 "stackoverflow" 
(integer) 1 
127.0.0.1:6379> zadd sorted 2 "a" 
(integer) 1 
127.0.0.1:6379> ZRANGE sorted 0 -1 
1) "stackoverflow" 
2) "z" 
3) "a" 

SADDSMEMBERS與無序集​​工作。