有序集合同时具有“有序”和“集合” 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.
时间复杂度: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;