# Redis有序集合(Sorted Set)

概念

Redis有序集合(Sorted Set)是Redis中一种特殊数据结构,每个元素关联一个分数(score),元素按分数自动排序,且元素唯一。它融合了集合(唯一性)和有序列表(排序)的特性,适用于需要精确控制排序的场景。

# 作用

  • 存储带权重的数据(如游戏排行榜、城市人口)。

  • 高效范围查询(按分数、字典序、索引)。

  • 集合运算(交集、并集),常用于数据分析。

# 特性

  • 唯一性:元素不可重复,分数可重复。

  • 自动排序:默认按分数升序,相同分数按字典序排序。

  • 范围操作:支持按分数、字典序、索引范围查询/删除。

  • 高性能:插入、删除、查询时间复杂度为 O(logN) 。

# 场景

  • 排行榜(如游戏积分实时更新)。

  • 优先级队列(如任务调度按优先级排序)。

  • 带权重的去重数据(如城市按人口排序)。

  • 时间轴(按时间戳范围快速检索)。

# 示例

# 1.创建有序集合并初始化数据

创建主要城市及其人口(单位:万),并以人口作为分数:

# 删掉上一节的主城市数据
127.0.0.1:6379> DEL mainCity
(integer) 1
# 初始化数据(mainCity 存储主要城市及人口)
127.0.0.1:6379> ZADD mainCity 2000 beijing 2400 shanghai 1500 guangzhou 1200 shenzhen
(integer) 4

# 2.单一添加或更新元素

# 添加重庆(chongqing)到 mainCity,人口 3100 万
127.0.0.1:6379> ZADD mainCity 3100 chongqing
(integer) 1

# 3.统计元素总量

127.0.0.1:6379> ZCARD mainCity
(integer) 5

# 4.统计分数范围内的元素

# 统计人口在 1000~2000 万之间的城市数量
127.0.0.1:6379> ZCOUNT mainCity 1000 2000
(integer) 3  # guangzhou(1500)、shenzhen(1200)、beijing(2000)

# 5.增减元素分数

# 北京人口增加 100 万
127.0.0.1:6379> ZINCRBY mainCity 100 beijing
"2100"
# 重庆人口减少 100 万
127.0.0.1:6379> ZINCRBY mainCity -100 chongqing
"3000"

# 6.统计字典序范围内的元素

# 创建按城市名排序的集合(所有分数相同)
127.0.0.1:6379> ZADD cityLex 0 beijing 0 shanghai 0 guangzhou 0 shenzhen
(integer) 4

# 统计字典序在 [guangzhou, shanghai] 之间的城市
127.0.0.1:6379> ZLEXCOUNT cityLex [guangzhou [shanghai
(integer) 2  # guangzhou、shanghai

# 7.按索引范围获取元素

# 获取前 3 个城市(按人口升序)
127.0.0.1:6379> ZRANGE mainCity 0 2 WITHSCORES
1) "shenzhen"   2) "1200"
3) "guangzhou"  4) "1500"
5) "beijing"    6) "2100"

# 8.按字典序范围获取元素

# 获取字典序在 [b, s) 之间的城市(需分数相同)
127.0.0.1:6379> ZRANGEBYLEX cityLex [b [s
1) "beijing"    2) "guangzhou"

# 9.按分数范围获取元素

# 获取人口在 1500~2500 万之间的城市
127.0.0.1:6379> ZRANGEBYSCORE mainCity 1500 2500 WITHSCORES
1) "guangzhou"  2) "1500"
3) "beijing"    4) "2100"
5) "shanghai"   6) "2400"

# 10.删除指定元素

# 删除广州(guangzhou)
127.0.0.1:6379> ZREM mainCity guangzhou
(integer) 1

# 11.增量遍历元素

# 从游标 0 开始遍历所有元素
127.0.0.1:6379> ZSCAN mainCity 0
1) "0"  # 新游标
2) 1) "shenzhen"   2) "1200"
   3) "beijing"    4) "2100"
   5) "shanghai"   6) "2400"
   7) "chongqing"  8) "3000"

# 12.获取元素分数

# 查询上海(shanghai)的人口
127.0.0.1:6379> ZSCORE mainCity shanghai
"2400"

# 命令集

在 Redis 客户端(如 redis-cli )可以通过help @sorted_set命令查找所有与有序集合相关的命令,效果如下:

127.0.0.1:6379> help @sorted_set

  ZADD key score member [score member ...]
  summary: Add one or more members to a sorted set, or update its score if it already exists
  since: 1.2.0

  ZCARD key
  summary: Get the number of members in a sorted set
  since: 1.2.0

  ZCOUNT key min max
  summary: Count the members in a sorted set with scores within the given values
  since: 2.0.0

  ……

以下是 Redis-x64-3.0.504 版本的有序集合命令集:

命令 说明 版本
ZADD key score member [score member ...] 添加一个或多个成员到有序集合,或更新已存在成员的分数 1.2.0+
ZCARD key 获取有序集合的成员数量 1.2.0+
ZCOUNT key min max 统计分数在给定范围内的成员数量 2.0.0+
ZINCRBY key increment member 增加有序集合中某个成员的分数 1.2.0+
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 求多个有序集合的交集,并将结果存储到新键 2.0.0+
ZLEXCOUNT key min max 统计字典序范围内的成员数量 2.8.9+
ZRANGE key start stop [WITHSCORES] 按索引返回有序集合的成员范围 1.2.0+
ZRANGEBYLEX key min max [LIMIT offset count] 按字典序返回有序集合的成员范围 2.8.9+
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按分数返回有序集合的成员范围 1.0.5+
ZRANK key member 获取成员在有序集合中的索引(升序) 2.0.0+
ZREM key member [member ...] 从有序集合中移除一个或多个成员 1.2.0+
ZREMRANGEBYLEX key min max 移除字典序范围内的所有成员 2.8.9+
ZREMRANGEBYRANK key start stop 移除索引范围内的所有成员 2.0.0+
ZREMRANGEBYSCORE key min max 移除分数范围内的所有成员 1.2.0+
ZREVRANGE key start stop [WITHSCORES] 按索引返回有序集合的成员范围(分数降序) 1.2.0+
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 按分数返回有序集合的成员范围(分数降序) 2.2.0+
ZREVRANK key member 获取成员在有序集合中的索引(降序) 2.0.0+
ZSCAN key cursor [MATCH pattern] [COUNT count] 增量遍历有序集合的成员及其分数 2.8.0+
ZSCORE key member 获取成员在有序集合中的分数 1.2.0+
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 求多个有序集合的并集,并将结果存储到新键 2.0.0+



微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。