Zset 有序集合, 这里的有序是指升序 / 降序
排序的规则是, 给每个 member 引入了一个 score (浮点类型), 根据 score 进行排序
Zset 集合特点: 有序, 唯一 (member 唯一)

其底层数据结构实现有: ziplist , skiplist (跳表)

zadd key [NX | XX] [GT | LT] [INCR] score member [score member ...]

往有序集合中, 添加分数和元素
返回新增成功的元素个数
分数相同, 会按照元素自身字符串字典序来排列

这里的 member 和 score 更像是 C++ 中的 std::pair, 既可以根据 member 找到 score, 也能根据 score 找到 member

XX : 只能修改元素, 不能添加元素
NX : 只能添加元素, 不能修改元素
[XX | NX] 都不添加, 就会产生新的值覆盖旧值, 没有旧值就会新增元素

LT : less than 更新分数, 只有新值比旧值小的时候才能更新
GT : greater than 更新分数, 只有新值比旧值大的时候才能更新

注意, 此操作的 时间复杂度是 O(log(N)), 其他 Hash, Set, List 的插入数据都是 O(1) 的
Zset 内部按照升序方式来排列 (实际实现)


zrange key start end

查看有序集合中的元素详情(因为有序,所以有了下标的概念)


zrange key start end withscore

查看有序集合中的 元素和分数 的详情


zcard key

查看集合元素个数


zcount key min max

查看集合某一区间的元素个数开区间
可用 ( 表示, 用 [ 表示闭区间
记住 括号 只能在元素左侧使用

min 和 max 可以写成浮点数
inf 无穷大, -inf 负无穷大


zrevrange key start end withscores

逆序显示 元素和分数 详情
先逆序, 再选区间


zrangebyscore key min max [withscore]

按照分数来找元素, 和 zcount 类似


zpopmax key [count]

删除并返回分数最高的 count 个元素 (包括 member 和 score)
topK 问题


bzpopmax key [key ...] timeout

阻塞队列 — 删除最大的 count 个元素
每个 key 都是一个 有序集合
timeout 超时时间, 单位是 s , 支持小数形式


zpopmin key [count]

删除有序集合中, 最小的元素


bzpopmin key [key ...] timeout

阻塞队列 — 删除最小的 count 个元素
每个 key 都是一个 有序集合
timeout 超时时间, 单位是 s , 支持小数形式


zrank key member

查询元素的位置 (下标, 升序计算 [正数第几])


zrevrank key member

查询元素的位置 (下标, 倒序计算 [倒数第几])


zscore key member 

获取元素对应的 分数


zrem key member [member ...]

根据元素删除元素


zremrangebyrank key start stop

根据 下标 删除指定区间的元素


zremrangebyscore key min max

根据 分数 删除指定区间的元素


zincrby key increment member

修改分数内容


zinter zunion zdiffzinterstorezunionstorezdiffstore
zinterstore destination numkeys key [key ...] [weights weight[weight ...]] [aggregate ]

weight 代表权重
aggregate 代表以什么样的结果呈现 (求和, 最大值, 最小值)


粘包问题

tcp 使用数据报发送数据, 但是当多个包传过来后, 后一个包的头紧贴着前一个包的尾, 造成的数据包之间不好区分
如何解决” />Zset 应用场景

最常用 —- 排行榜系统
普通游戏排行榜, 可能只需要根据分数来排序
像 csdn 排行榜, 微博热搜排行榜, 可能就需要综合考虑
以 scdn 为例, 点赞, 收藏, 浏览量, 可能要以不同比重 重新赋值, 再进行排序 …