有序集合

有序集合同时具有“有序”和“集合” 2 种性质。

基本命令

ZADD

添加一个或多个元素到有序集合,返回添加元素的数量。

NX 参数:只会操作不存在的元素;

XX 参数:只会操作存在的元素;

CH 参数:返回更新元素的个数;

1
2
3
4
5
6
7
8
9
10
11
12
-- 4
ZADD salary 3500 "peter" 4000 "jack" 2000 "tom" 5500 "mary"

-- 更新 member 的 score,没有成员添加,返回 0
ZADD salary 3501 "peter"

-- 返回 1,增加 hanzhang,并且 peter 不会改变
ZADD salary NX 6000 "hanzhang" 3500 "peter"
-- 返回 0,将 hanzhang 更新为 6000,peter 更新为 3500
ZADD salary XX 6000 "hanzhang" 3500 "peter"
-- 返回 2,将 hanzhang 更新为 6001,peter 更新为 3501
ZADD salary CH XX 6001 "hanzhang" 3501 "peter"

时间复杂度:O(m * logn)。m 为 member 的数量,n 为成员数量。

ZREM

从集合中删除一个或多个元素,返回移除元素的数量。

1
2
3
4
-- 返回 1
ZREM salary "peter"
-- 返回 2
ZREM salary "hanzhang" "tom"

时间复杂度:O(m * logn)。m 为 member 的数量,n 为成员数量。

ZSCORE

获取给定 member 的 score。

不存在的有序集合或 member 返回 nil。

1
2
-- 4000
ZSCORE salary "jack"

时间复杂度:O(1)

ZINCRBY

将给定 member 的 score 进行增加或减少,返回更新后的 score。

不存在的有序集合会进行创建。

1
2
3
4
5
6
7
8
9
10
11
-- 1000
ZINCRBY salary 1000 "jack"

-- 2000
ZINCRBY salary 1000 "jack"

-- 1000
ZINCRBY salary -1000 "jack"

-- 0
ZINCRBY salary -1000 "jack"

时间复杂度:O(n)

ZCARD

返回有序集合中元素个数,有序集合不存在则返回 0.

1
2
-- 返回元素个数
ZCARD salary

时间复杂度:O(1)

ZRANK

返回元素在有序集合的升序下标,集合或元素不存在,返回 nil。

1
2
-- 1
ZRANK salary "peter"

时间复杂度:O(logn)

ZREVRANK

返回元素在有序集合的降序下标,集合或元素不存在,返回 nil。

1
2
-- 2
ZREVRANK salary "peter"

时间复杂度:O(logn)

ZRANGE

获取升序中指定闭区间内的所有 member。

可以接受负索引,负索引从 -1 开始。

不存在时,返回空。

1
2
3
4
5
6
7
8
9
10
11
12
-- tom peter jack mary

-- tom peter jack
ZRANGE salary 0 2
-- jack mary
ZRANGE salary -2 -1
-- tom peter jack
ZRANGE salary 0 -2
-- 以升序获取全部
ZRANGE salary 0 -1
-- 返回 member 的同时,返回 score
ZRANGE salary 0 -1 WITHSCORES

时间复杂度:O(logn + m)

ZREVRANGE

获取降序中指定闭区间内的所有 member。

可以接受负索引,负索引从 -1 开始。

不存在时,返回空。

1
2
3
4
5
6
7
8
9
10
-- mary jack peter
ZREVRANGE salary 0 2
-- peter tom
ZREVRANGE salary -2 -1
-- mary jack peter
ZREVRANGE salary 0 -2
-- 以降序获取全部
ZREVRANGE salary 0 -1
-- 返回 member 的同时,返回 score
ZREVRANGE salary 0 -1 WITHSCORES

时间复杂度:O(logn + m)

ZCOUNT

返回指定闭区间内成员数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ZADD salary 3500 "peter" 4000 "jack" 2000 "tom" 5500 "mary"

-- 3,[2000, 4000]
ZCOUNT salary 2000 4000
-- 2, (2000, 4000]
ZCOUNT salary (2000 4000
-- 2, [2000, 4000)
ZCOUNT salary 2000 (4000
-- 1, (2000, 4000)
ZCOUNT salary (2000 (4000
-- 3, [3500, +∞)
ZCOUNT salary 3500 +inf
-- 3, (-∞, 3500]
ZCOUNT salary -inf 3500

时间复杂度:O(logn)

ZREMRANGEBYRANK

从升序排列中移除闭区间排名的元素,返回被移除元素的数量。

1
2
3
4
-- 2
ZREMRANGEBYRANK salary 1 2
-- 2
ZREMRANGEBYRANK salary -2 -1

时间复杂度:O(logn + m)

ZREMRANGEBYRANK

从升序排列中移除间分值的元素,返回被移除元素的数量。

1
2
3
4
5
-- 2
ZREMRANGEBYSCORE salary 4000 5500

-- 1
ZREMRANGEBYSCORE salary (4000 5500

时间复杂度:O(logn + m)

总结

  • 有序集合同时拥有“有序”和“集合” 2 种性质;
  • 一般情况下,有序集合的顺序由分值 score 决定,而分值相同的成员排序由 member 的字典序决定;
  • member 的分数除了可以是数字之外,还能为 -inf 和 +inf;