SortedSet

REDIS SortedSet

ZADD

  • 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
  • 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
  • score 值可以是整数值或双精度浮点数。
  • 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
  • 当 key 存在但不是有序集类型时,返回一个错误。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # 添加单个元素

    redis> ZADD page_rank 10 google.com
    (integer) 1


    # 添加多个元素

    redis> ZADD page_rank 9 baidu.com 8 bing.com
    (integer) 2

    redis> ZRANGE page_rank 0 -1 WITHSCORES
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"


    # 添加已存在元素,且 score 值不变

    redis> ZADD page_rank 10 google.com
    (integer) 0

    redis> ZRANGE page_rank 0 -1 WITHSCORES # 没有改变
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"


    # 添加已存在元素,但是改变 score 值

    redis> ZADD page_rank 6 bing.com
    (integer) 0

    redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改变
    1) "bing.com"
    2) "6"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"

ZCARD

  • 返回有续集key的基数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    redis > ZADD salary 2000 tom    # 添加一个成员
    (integer) 1

    redis > ZCARD salary
    (integer) 1

    redis > ZADD salary 5000 jack # 再添加一个成员
    (integer) 1

    redis > ZCARD salary
    (integer) 2

    redis > EXISTS non_exists_key # 对不存在的 key 进行 ZCARD 操作
    (integer) 0

    redis > ZCARD non_exists_key
    (integer) 0

ZCOUNT

  • 返回游戏集key中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量
  • 返回score 值在 min 和 max 之间的成员的数量。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    127.0.0.1:6379> zadd salary 2000 "jack"
    (integer) 1
    127.0.0.1:6379> zadd salary 2500 "peter"
    (integer) 1
    127.0.0.1:6379> zadd salary 5000 "tom"
    (integer) 1
    127.0.0.1:6379> zcount salary 2000 5000
    (integer) 3
    127.0.0.1:6379> zcount salary 3000 5000
    (integer) 1

ZINCRBY

  • 为有序集 key 的成员 member 的 score 值加上增量 increment
  • 可以传递负数
  • key不存在时 ZINCRBY key increment member 等同于 ZADD key increment member
  • 当 key 不是有序集类型时,返回一个错误
  • score 值可以是整数值或双精度浮点数
    1
    2
    3
    4
    127.0.0.1:6379>  ZSCORE salary tom
    "5000"
    127.0.0.1:6379> ZINCRBY salary 2000 tom
    "7000"

ZRANGE

  • 返回有序集 key 中,指定区间内的成员
  • 其中成员的位置按 score 值递增(从小到大)来排序
  • 具有相同 score 值的成员按字典序(lexicographical order )来排列
  • 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES //显示整个有序集成员
1) "jack"
2) "2000"
3) "peter"
4) "2500"
5) "tom"
6) "7000"
127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES //显示有序集下标区间1至2的成员
1) "peter"
2) "2500"
3) "tom"
4) "7000"
127.0.0.1:6379> ZRANGE salary 0 200000 WITHSCORES //测试超出最大下标情况
1) "jack"
2) "2000"
3) "peter"
4) "2500"
5) "tom"
6) "7000"
127.0.0.1:6379> ZRANGE salary 200000 3000000 WITHSCORES //测试不再区间的集合情况
(empty list or set)

ZRANGEBYSCORE

  • 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
  • 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
  • 可使用limit参数 像SQL中的 SELECT LIMIT offset, count 注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间
  • 可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    redis> ZADD salary 2500 jack                        # 测试数据
    (integer) 0
    redis> ZADD salary 5000 tom
    (integer) 0
    redis> ZADD salary 12000 peter
    (integer) 0

    redis> ZRANGEBYSCORE salary -inf +inf # 显示整个有序集
    1) "jack"
    2) "tom"
    3) "peter"

    redis> ZRANGEBYSCORE salary -inf +inf WITHSCORES # 显示整个有序集及成员的 score 值
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"
    5) "peter"
    6) "12000"

    redis> ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 显示工资 <=5000 的所有成员
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"

    redis> ZRANGEBYSCORE salary (5000 400000 # 显示工资大于 5000 小于等于 400000 的成员
    1) "peter"
    indexnext

ZRANK

  • 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
  • 排名以 0 为底,也就是说, score 值最小的成员排名为 0
  • 使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名
1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES   # 显示所有成员及其 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"
127.0.0.1:6379> ZRANK salary tom # 显示 tom 的薪水排名,第二 下表0开始计算
(integer) 1
127.0.0.1:6379> ZRANK salary jack
(integer) 0
127.0.0.1:6379> zrank salary peter
(integer) 2

ZREM

  • 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略
  • 当 key 存在但不是有序集类型时,返回一个错误
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    127.0.0.1:6379> zadd page_rank 8 "bing.com"
    (integer) 1
    127.0.0.1:6379> zadd page_rank 9 "google.com"
    (integer) 1
    127.0.0.1:6379> zadd page_rank 10 "baidu.com"
    (integer) 1
    127.0.0.1:6379> ZREM page_rank google.com #移除单个元素
    (integer) 1
    127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "10"
    127.0.0.1:6379> ZREM page_rank baidu.com bing.com #移除多个元素
    (integer) 2
    127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
    (empty list or set)
    127.0.0.1:6379> ZREM page_rank non-exists-element # 移除不存在元素
    (integer) 0

ZREMRANGEBYRANK

  • 移除有序集 key 中,指定排名(rank)区间内的所有成员
  • 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    127.0.0.1:6379> ZADD salary 2000 jack
    (integer) 1
    127.0.0.1:6379> ZADD salary 5000 tom
    (integer) 1
    127.0.0.1:6379> ZADD salary 3500 peter
    (integer) 1
    127.0.0.1:6379> ZREMRANGEBYRANK salary 0 1 # 移除下标 0 至 1 区间内的成员
    (integer) 2
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 有序集只剩下一个成员
    1) "tom"
    2) "5000"

ZREMRANGEBYSCORE

  • 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES  # 显示有序集内所有成员及其 score 值
    1) "tom"
    2) "2000"
    3) "peter"
    4) "3500"
    5) "jack"
    6) "5000"
    127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500 # 移除所有薪水在 1500 到 3500 内的员工
    (integer) 2
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成员
    1) "jack"
    2) "5000"

ZREVRANGE

  • 返回有序集 key 中,指定区间内的成员
  • 其中成员的位置按 score 值递减(从大到小)来排列
  • 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES  # 递增排列
    1) "tom"
    2) "2000"
    3) "peter"
    4) "3500"
    5) "jack"
    6) "5000"
    127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES # 递减排列
    1) "jack"
    2) "5000"
    3) "peter"
    4) "3500"
    5) "tom"
    6) "2000"

ZREVRANGEBYSCORE

  • 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列
  • 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    127.0.0.1:6379> ZADD salary 10086 jack
    (integer) 1
    127.0.0.1:6379> ZADD salary 5000 tom
    (integer) 1
    127.0.0.1:6379> ZADD salary 7500 peter
    (integer) 1
    127.0.0.1:6379> ZADD salary 3500 joe
    (integer) 1
    127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员
    1) "jack"
    2) "peter"
    3) "tom"
    4) "joe"
    127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于 10000 和 2000 之间的成员
    1) "peter"
    2) "tom"
    3) "joe"

ZREVRANK

  • 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES
    1) "joe"
    2) "3500"
    3) "tom"
    4) "5000"
    5) "peter"
    6) "7500"
    7) "jack"
    8) "10086"
    127.0.0.1:6379> ZREVRANK salary peter # peter 的工资排第二 下标从0开始
    (integer) 1
    127.0.0.1:6379> ZREVRANK salary tom
    (integer) 2

ZSCORE

  • 返回有序集 key 中,成员 member 的 score 值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 测试数据
    1) "joe"
    2) "3500"
    3) "tom"
    4) "5000"
    5) "peter"
    6) "7500"
    7) "jack"
    8) "10086"
    127.0.0.1:6379> ZSCORE salary peter # 注意返回值是字符串
    "7500"