Redis---有序集合

标签:Redis首次发布:2023-11-11最近修改:2026-08-15

有序集合概述

  • Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

  • 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

  • 有序集合的成员是唯一的,但分数(score)却可以重复。

  • 对于相同分数的成员会按照字母序的顺序进行排序。

  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储 40 多亿个成员)。

命令

zadd

  • 格式:zadd key score member [ [score member] [score member] …]
  • 功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。
  • 说明:score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 zadd 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但 score 值不同,则新的 score 值将覆盖老 score。
bash
127.0.0.1:6379> zadd team 30 DYG 20 TTG 50 WE 50 RW 60 XYG 70 ES 70 DRG 90 AG(integer) 8127.0.0.1:6379> zrange team 0 -11) "TTG"2) "DYG"3) "RW"4) "WE"5) "XYG"6) "DRG"7) "ES"8) "AG"

zrange 与 zrevrange

  • 格式:zrange key start stop [ bysorce | bylex ] [rev] [limit offset count] [withscores] 或 zrevrange key start stop [withscores]
  • 功能:返回有序集 key 中,指定区间内的成员。zrange 命令会按 score 值递增排序,zrevrange 命令会按 score 递减排序。具有相同 score 值的成员按字典序/逆字典序排列。可以通过使用 withscores 选项,来让成员和它的 score 值一并返回。
  • 说明:中括号当中的都是可选项。start 和 stop默认表示下标,下标支持正数和负数。超出范围的下标并不会引起错误。例如,当 start 的值比有序集的最大下标还要大,或是 start > stop 时,zrange 命令只是简单地返回一个空列表。再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。当使用 bysorce 选项时,start 和 stop 表示分数的最大值和最小值;bylex 选项用于分数相同的有序集合。rev 选项表示逆序输出结果;[limit offset count]选项用于对前面的结果做进一步筛选。若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。
bash
# 使用下标127.0.0.1:6379> zrange team 0 -1 withscores 1) "TTG" 2) "20" 3) "DYG" 4) "30" 5) "RW" 6) "50" 7) "WE" 8) "50" 9) "XYG"10) "60"11) "DRG"12) "70"13) "ES"14) "70"15) "AG"16) "90"# 使用分数127.0.0.1:6379> zrange team 30 (70 byscore1) "DYG"2) "RW"3) "WE"4) "XYG"
bash
127.0.0.1:6379> zadd character 1 a 1 aa 1 b 1 bb 1 x 1 xyz(integer) 6# 使用字母序,前提是整个有序集合的分数相同127.0.0.1:6379> zrange character [a [z bylex1) "a"2) "aa"3) "b"4) "bb"5) "x"6) "xyz"# 2表示偏移量,3表示输出3个127.0.0.1:6379> zrange character [a [z bylex limit 2 31) "b"2) "bb"3) "x"

zrangebyscore 与 zrevrangebyscore

  • 格式:zrangebyscore key min max [withscores] [limit offset count] 或 zrevrangebyscore key max min [withscores] [limit offset count]

  • 功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 limit 参数指定返回结果的数量及区间(就像 SQL 中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 withscores 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

  • 说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)。

bash
127.0.0.1:6379> zrangebyscore team -inf +inf1) "TTG"2) "DYG"3) "RW"4) "WE"5) "XYG"6) "DRG"7) "ES"8) "AG"127.0.0.1:6379> zrangebyscore team 30 (60 withscores1) "DYG"2) "30"3) "RW"4) "50"5) "WE"6) "50"127.0.0.1:6379> zrevrangebyscore team (60 30 withscores1) "WE"2) "50"3) "RW"4) "50"5) "DYG"6) "30"

zcard

  • 格式:zcard key

  • 功能:返回集合的长度

  • 说明:当 key 不存在时,返回 0 。

bash
127.0.0.1:6379> zcard team(integer) 8

zcount

  • 格式:zcount key min max
  • 功能:返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
bash
127.0.0.1:6379> zcount team -inf +inf(integer) 8127.0.0.1:6379> zcount team (20 (70(integer) 4

zscore

  • 格式:zscore key member
  • 功能:返回有序集 key 中,成员 member 的 score 值。
  • 说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
bash
127.0.0.1:6379> zscore team AG"90"127.0.0.1:6379> zscore team KSG(nil)

zincrby

  • 格式:zincrby key increment member
  • 功能:为有序集 key 的成员 member 的 score 值加上增量 increment 。increment 值可以是整数值或双精度浮点数
  • 说明:可以通过传递一个负数值 increment ,让 score 减去相应的值。当 key 不存在,或 member 不是 key 的成员时, zincrby key increment member 等同于 zadd key increment member 。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score 值。
bash
127.0.0.1:6379> zincrby team 20 AG"110"127.0.0.1:6379> zincrby team -15 AG"95"zrank team AG

zrank 与 zrevrank

  • 格式:zrank key member 或 zrevrank key member
  • 功能:返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。
  • 说明:score 值最小的成员排名为 0 ,最大的成员排名为总成员数量减一。如果 member 不是有序集 key 的成员,返回 nil 。
bash
127.0.0.1:6379> zcard team(integer) 8127.0.0.1:6379> zrank team AG(integer) 7127.0.0.1:6379> zrevrank team AG(integer) 0

zrem

  • 格式:zrem key member [member …]
  • 功能:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
  • 说明:当 key 存在但不是有序集类型时,返回一个错误。执行成功,则返回被成功移除的成员的数量,不包括被忽略的成员。
bash
127.0.0.1:6379> zrem team DYG DRG(integer) 2

zremrangebyrank

  • 格式:zremrangebyrank key start stop
  • 功能:移除有序集 key 中,指定排名(rank)区间内的所有成员。
  • 说明:排名区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。排名区间参数从 0 开始,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。也可以使用负数表示,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。命令执行成功,则返回被移除成员的数量。
bash
127.0.0.1:6379> zremrangebyrank character 2 4(integer) 3

zremrangebyscore

  • 格式:zremrangebyscore key min max
  • 功能:移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
  • 说明:命令执行成功,则返回被移除成员的数量。
bash
127.0.0.1:6379> zrange team 0 -1 withscores 1) "TTG" 2) "20" 3) "RW" 4) "50" 5) "WE" 6) "50" 7) "XYG" 8) "60" 9) "ES"10) "70"11) "AG"12) "95"127.0.0.1:6379> zremrangebyscore team 50 (60(integer) 2127.0.0.1:6379> zrange team 0 -1 withscores1) "TTG"2) "20"3) "XYG"4) "60"5) "ES"6) "70"7) "AG"8) "95"

zrangebylex

  • 格式:zrangebylex key min max [LIMIT offset count]

  • 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序。即这个命令返回给定集合中元素值介于 min 和 max 之间的成员。如果有序集合里面的成员带有不同的分值, 那么命令的执行结果与 zrange key 效果相同。

  • 说明:合法的 min 和 max 参数必须包含左小括号“(”或左中括号“[”,其中左小括号“(”表示开区间, 而左中括号“[”则表示闭区间。min 或 max 也可使用特殊字符“+”和“-”,分别表示正无穷大与负无穷大。

bash
127.0.0.1:6379> zadd character 1 a 1 aa 1 b 1 bc 1 c 1 cf 1 f 1 ff 1 xyz(integer) 9127.0.0.1:6379> zrange character 0 -11) "a"2) "aa"3) "b"4) "bc"5) "c"6) "cf"7) "f"8) "ff"9) "xyz"127.0.0.1:6379> zrangebylex character [b (f1) "b"2) "bc"3) "c"4) "cf"

zlexcount

  • 格式:zlexcount key min max
  • 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令返回该集合中元素值本身(而非 score 值)介于 min 和 max 范围内的元素数量。
bash
127.0.0.1:6379> zlexcount character [b (f(integer) 4

zremrangebylex

  • 格式:zremrangebylex key min max
  • 功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令会移除该集合中元素值本身介于 min 和 max 范围内的所有元素。
bash
127.0.0.1:6379> zrange character 0 -11) "a"2) "aa"3) "b"4) "bc"5) "c"6) "cf"7) "f"8) "ff"9) "xyz"# 删除字典序上大于 b 且小于等于 f 的成员127.0.0.1:6379> zremrangebylex character (b [f(integer) 4127.0.0.1:6379> zrange character 0 -11) "a"2) "aa"3) "b"4) "ff"5) "xyz"

应用场景

有序 Set 最为典型的应用场景就是排行榜,例如音乐、视频平台中根据播放量进行排序的排行榜;电商平台根据用户评价或销售量进行排序的排行榜等。将播放量作为 score,将作品 id 作为 member,将用户评价积分或销售量作为 score,将商家 id 作为 member。使用 zincrby 增加排序 score,使用 zrevrange 获取 Top 前几名,使用 zrevrank 查询当前排名,使用 zscore 查询当前排序 score 等。

Comments

评论区将在滚动到这里时加载。