# 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交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。