Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(五) 有序集合类型

Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(五) 有序集合类型

一、介绍

  • 有序集合类型(sorted set)的特点从它的名字中就可以猜出,它与集合类型的区别就是“有序”两字。在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除以及判断及元素是否存在等集合类型支持的操作,还能够获得分数最高(最低)的前 N 个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中的每个元素都是不同的,但是它们的分数却可以相同

  • 有序集合类型在某些方面和列表类型有些相似

    • (1)二者都是有序的

    • (2)二者都可以获得某一范围的元素

  • 但是二者有着很大的区别,这使得它们的应用场景也就有所不同

    • (1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合如“新鲜事”或“日志”这样很少访问中间元素的应用

    • (2)有序集合类型是使用散列表和跳跃表实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度为 O ( l o g ( N ) ) O(log(N)) O(log(N))

    • (3)散列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更新元素的分数)

    • (4)有序集合比列表更耗内存

二、命令

  • 1.增加元素

    • ZADD 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD 命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素)。例如:

      redis> ZADD scoreboard 89 Tom 67 Peter 100 David
      (integer) 3
      
    • 同样使用 ZADD 命令来修改分数:

      redis> ZADD scoreboard 76 Peter
      (integer) 0
      
    • 分数不仅支持整数,还支持双精度浮点数:

      redis> ZADD testboard 17E+307 a
      (integer) 1
      redis> ZADD testboard 1.5 b
      (integer) 1
      
  • 2.获得元素的分数

    • 使用 ZSCORE 来获得元素的分数,例如:

      redis> SCORE scoreboard Tom
      "89"
      
  • 3.获得排名在某个范围内的元素列表

    • ZRANGE 命令会按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包括两端的元素)。ZRANGE 命令与 LRANGE 命令十分相似,如索引都是从 0 开始、负数代表从后向前查找(-1 表示最后一个元素)。例如:

      redis> ZRANGE scoreboard 0 2
      1) "Peter"
      2) "Tom"
      3) "David"
      redis> ZRANGE scoreboard 1 -1
      1) "Tom"
      2) "David"
      
    • 如果需要同时获得分数的话可以在 ZRANGE 命令的尾部加上 WITHSCORES 参数,例如:

      redis> ZRANGE scoreboard 0 -1 WITHSCORES
      1) "Peter"
      2) "76"
      3) "Tom"
      4) "89"
      5) "David"
      6) "100"
      
    • 还有一点就是,如果两个元素的分数相同,Redis 会根据字典顺序来排序

    • 如果想要按照元素分数从大到小的顺序,则可以使用 ZREVRANGE 命令,这也是 ZREVRANGE 和 ZRANGE 的唯一不同点

  • 4.获得指定分数范围的元素

    • ZRANGEBYSCORE 命令按照元素分数从小到大的顺序返回分数在 min 和 max 之间(包含 min 和 max)的元素,例如:

      redis> ZRANGEBYSCORE scoreboard 80 100
      1) "Tom"
      2) "David"
      
    • 如果希望分数范围不包含端点值,可以在分数前加上 “(” 符号。例如,希望返回 80 分到 100 分的数据,不包含 80 和 100,则:

      redis> ZRANGEBYSCORE scoreboard (80 (100
      1) "Tom"
      
    • WITHSCORES 参数的用法与 ZRANGE 命令一致,不再赘述

    • 值得一提的一点,min 和 max 参数支持负无穷小、正无穷(ZADD 命令中也支持),-inf 和 +inf 分别表示负无穷和正无穷。应用场景,比如:你希望得到所有分数高于 80 分 (不包含80)的人的名单,但是不知道最高分是多少,那么:

      redis> ZRANGEBYSCORE scoreboard (80 +inf
      1) "Tom"
      2) "David"
      
  • 5.增加某个元素的分数

    • ZINCRBY 命令可以增加一个元素的分数,返回值是更改后的分数。例如,要给 Jerry 加 4 分:

      redis> ZINCRBY scoreboard 4 Jerry
      "60"
      
    • increment 也可以是个负数,表示减分:

      redis> ZINCRBY scoreboard -4 Jerry
      "56"
      
    • 如果指定的元素不存在,Redis 在执行命令之前会建立它并将它的分数赋值为 0 再执行操作

  • 6.获得集合中元素的个数

    • ZCARD 命令用来获得集合中元素的数量,例如:

      redis> ZCARD scoreboard
      (integer) 6
      
  • 7.获得指定分数范围内的元素个数

    • 使用 ZCOUNT 命令,例如:

      redis> ZCOUNT scoreboard 90 100
      (integer) 2
      
    • ZCOUNT 命令的 min 和 max 参数特性与 ZRANGEBYSCORE 命令中的一样,不再赘述

  • 8.删除一个或多个元素

    • ZREM 命令用来删除集合中的元素(可以同时给出多个元素进行删除),其返回值是成功删除的元素数量(不包含本来就不存在的元素),例如:

      redis> ZREM scoreboard Wendy
      (integer) 1
      redis> ZCARD scoreboard
      (integer) 5
      
  • 9.按照排名范围删除元素

    • ZREMRANGEBYRANK 命令按照元素分数从小到大的顺序(即索引 0 表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量。例如:

      redis> ZADD testRem 1 a 2 b 3 c 4 d 5 e 6 f
      (integer) 6
      redis> ZREMRANGEBYRANK testRem 0 2
      (integer) 3
      redis> ZRANGE testRem 0 -1
      1) "d"
      2) "e"
      3) "f"
      
  • 10.按照分数范围删除元素

    • ZREMRANGEBYSCORE 命令会删除指定范围内的所有元素,参数 min 和 max 的特性和 ZRANGEBYSCORE 命令中的一样。返回值是删除的元素数量。例如:

      redis> ZREMRANGEBYSCORE testrem (4 5
      (integer) 1
      redis> ZRANGE testRem 0 -1
      1) "d"
      2) "f"
      
  • 11.获得元素的排名

    • ZRANK 命令会按照元素分数从小到大的顺序获得指定的元素的排名(从 0 开始,即分数最小的元素排名为 0)。例如:

      redis> ZRANK scoreboard Peter
      (integer) 0
      
    • ZREVRANK 命令则相反(分数最大的排名为 0),例如:

      redis> ZREVRANK scoreboard Peter
      (integer) 4
      

你可能感兴趣的:(Redis)