smembers:如何决定插入顺序?

时间:2016-04-29 08:43:08

标签: redis

当我们使用sadd在集合中插入成员时,是否有确定的方式来插入数据? 例如,

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"

可以看出,当我插入“堆栈溢出”时,“hello”显示在最后一个索引而不是索引2中,就像之前的查询一样。这种行为有解释吗?

2 个答案:

答案 0 :(得分:2)

使用哈希表实现集合并且是确定性的。但是,这并不意味着您从SMEMBERS获得的订单是您所期望的。

如果您需要词典排序,请使用排序集,其中所有成员具有相同的分数(例如零)。

答案 1 :(得分: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使用未排序的设置。