Redis ZSET(Sorted Set)数据类型详解

ZSET(有序集合)是Redis中一种兼具集合(Set)和有序特性的数据结构,每个元素关联一个分数(score),按分数排序且元素唯一。适用于排行榜、优先级队列等场景。

ZSET 核心特性
  • 唯一性:元素(member)不可重复,类似Set。
  • 有序性:元素按分数(score)排序,分数可相同。
  • 高效操作:插入、删除、查询时间复杂度为O(log N)。
常用指令分类

基础操作

  • ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
    添加元素,可选参数:
    NX:仅添加新元素
    XX:仅更新已存在元素
    CH:返回被修改元素总数
    INCR:分数递增(类似ZINCRBY)

  • ZREM key member [member ...]
    删除指定元素

  • ZSCORE key member
    获取元素的分数

  • ZRANK key member / ZREVRANK key member
    获取元素正序/逆序排名(从0开始)

范围查询

  • ZRANGE key start stop [WITHSCORES]
    按分数升序返回指定排名范围的元素

  • ZREVRANGE key start stop [WITHSCORES]
    按分数降序返回指定排名范围的元素

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    返回分数在[min, max]之间的元素(升序)

  • ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
    返回分数在[min, max]之间的元素(降序)

集合运算

  • ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    并集计算,结果存储到destination
    WEIGHTS:设置权重
    AGGREGATE:分数聚合方式(默认SUM)

  • ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    交集计算,参数同ZUNIONSTORE

统计与删除

  • ZCARD key
    获取集合元素总数

  • ZCOUNT key min max
    统计分数在[min, max]之间的元素数量

  • ZPOPMAX key [count] / ZPOPMIN key [count]
    删除并返回分数最大/最小的元素(Redis 5.0+)

实战示例

实现排行榜

# 添加玩家得分
ZADD leaderboard 1000 "player1" 950 "player2" 1200 "player3"

# 获取前三名
ZREVRANGE leaderboard 0 2 WITHSCORES

带权交集计算

# 存储用户兴趣标签(分数为偏好度)
ZADD user:1 1 "music" 3 "sports"
ZADD user:2 2 "music" 4 "travel"

# 计算共同兴趣(偏好度相加)
ZINTERSTORE common_interests 2 user:1 user:2 AGGREGATE SUM
性能优化建议
  • 控制ZSET元素数量,避免单个Key过大(可拆分多个Key)
  • 使用ZRANGEBYSCORE时合理设置LIMIT参数分页
  • 频繁更新的场景考虑Pipeline批量操作

通过合理利用ZSET的特性,能够高效解决多种有序数据管理需求。

更多推荐